在线时间3 小时
UID3554602
ST金币15
蝴蝶豆0
注册时间2019-4-15
该用户从未签到
新手上路
- 最后登录
- 2021-4-28
|
main文件中的代码
extern u16 RxDataValue_Temp ;
extern u8 RxData_ValidNum ;
extern u8 RXData[3]; //全局变量 完整数据包
extern unsigned char flagpacker; //全局变量 是否完整接收一个数据包
u8 TXData[3]={0x52,0xF6,0x09};
void main(void)
{
char Test = 0;
All_Config();
enableInterrupts(); //使能全局中断
SimUART_SendByte(0x01 );
/* Infinite loop */
while (1)
{
SimUART_SendByte( Test++ );
if( flagpacker ==1 )
{
for(u8 i=0;i<3;i++)
{
SimUART_SendByte( RXData[i] );
}
flagpacker = 0;
}
}
}
user文件中的代码
#include "user.h"
u16 SimUART_SendData = 0xFF;
u8 SimUART_SendData_BitNum = 10;
u8 RxData_ValidNum = 0;
u8 RxDataNum=0;
u8 RXData[3]; //全局变量 完整数据包
u16 RxDataValue=0x0000;
u16 RxDataValue_Temp = 0x0000;
void Clock_Config(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
}
void IO_Init()
{
//TXD:TXD位推挽输出 PD2
SimUART_PORT->ODR |= SimUART_PIN_TX; //0000 0100
SimUART_PORT->DDR |= SimUART_PIN_TX; //0000 0100
SimUART_PORT->CR1 |= SimUART_PIN_TX; //0000 0100
SimUART_PORT->CR2 &= ~SimUART_PIN_TX; //0000 0100
//RXD:悬浮输入 高电平 PD3
SimUART_PORT->IDR |= SimUART_PIN_RX; //0000 1000
SimUART_PORT->DDR &= ~SimUART_PIN_RX; //0000 1000
SimUART_PORT->CR1 &= ~SimUART_PIN_RX; //0000 1000
SimUART_PORT->CR2 &= ~SimUART_PIN_RX; //0000 1000
}
void TIM2_Init()
{
CLK->PCKENR1 |= CLK_PCKENR1_TIM2; //使能 TIM2
TIM2->PSCR = 0x04; //16分频 1MHZ 1us
TIM2->ARRH = ARRValue_9600 >> 8; //自动装载 每52us复位一次TIM2
TIM2->ARRL = ARRValue_9600; //每1us递减1
TIM2->CNTRH = 0; //定时器清零
TIM2->CNTRL = 0;
TIM2->CR1 |= TIM2_CR1_CEN; //开启定时器
}
//初始化中断
void Interrupt_Init()
{
//允许更新中断
//TIM2->CR1 &= ~TIM2_CR1_UDIS; //允许更新 可以不管默认为0
TIM2->IER |= TIM2_IER_UIE; //更新中断使能
//IO口下降中断 初始化
//SimUART_PORT->CR2 |= 0x08; //使能外部中断
SimUART_PORT->CR2 |= 0x08; //使能外部中断
EXTI->CR1 = 0x80; //仅下降沿触发
//禁止比较中断
TIM2->IER &= ~TIM2_IER_CC1IE; //禁止捕获/比较1
}
void SimUART_SendByte(u8 SendData)
{
while( SimUART_SendData_BitNum < 10 );
//清 更新中断标志位
TIM2->SR1 &= ~TIM2_SR1_UIF;
//0000 0000 0000 0000 保证最低位(起始)为0,除数据位后全部为1
SimUART_SendData = ( ( SendData << 1 )| (0xFE00) );
SimUART_SendData_BitNum = 0;
//开启更新中断
TIM2-> IER |= TIM2_IER_UIE;
}
//初始化函数
void All_Config( void )
{
Clock_Config();
IO_Init();
TIM2_Init();
Interrupt_Init();
}
中断文件中的代码
extern u16 SimUART_SendData ;
extern u8 SimUART_SendData_BitNum ;
extern u8 RxData_ValidNum ;
extern u8 RxDataNum;
extern u16 RxDataValue ;
extern u16 RxDataValue_Temp ;
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
//关闭IO中断
//SimUART_PORT->CR2 &= ~0x08;
SimUART_PORT->CR2 &= ~0x08;
//设置比较中断
TIM2-> CCMR1 &= 0x00; //还是有问题
//TIM2-> CCR1H = 0;
TIM2-> CCR1L = TIM2->CNTRL + ( ARRValue_9600/2 );
RxDataValue = 0x0000;
//TIM2->CCER1 |= 0x00;
TIM2->SR1 &= ~TIM2_SR1_CC1IF; //清中断标志位
TIM2->IER |= TIM2_IER_CC1IE; //使能 捕获/比较中断1
}
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
// //第一步,清中断标志位
TIM2->SR1 &= ~TIM2_SR1_UIF;
//发送一个位 计数
SimUART_SendData_BitNum++;
if( ((SimUART_SendData) & 0X0001) ) //如果是高电平,发高电平
{
SimUART_PORT->ODR |= SimUART_PIN_TX;
}
else //如果是低电平,发低电平
{
SimUART_PORT->ODR &= ~SimUART_PIN_TX;
}
//发送一个位
SimUART_SendData >>= 1;
if( 10 <= SimUART_SendData_BitNum )
{
TIM2-> IER &= ~TIM2_IER_UIE;
}
}
extern u8 RXData[3]; //全局变量 完整数据包
u8 RXData_end; //接受完数据
unsigned char flagpacker=0; //全局变量 是否完整接收一个数据包
INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14)
{
static unsigned char RxData1[255];//接收数据缓存区
static unsigned char count; //串口接收数据长度
//第一步,清中断标志位(防止始终进入中断)
TIM2->SR1 &= ~TIM2_SR1_CC1IF; //清中断标志位
RxDataNum++;
if( SimUART_PIN_RX == (SimUART_PORT->IDR & SimUART_PIN_RX ) )//其次,接收10个位
{
RxDataValue |= ( 0x01 << (RxDataNum) );//该位 置1
}
//第二步,读IO输入
//首先,判断是否接收了10个位
if(10 == RxDataNum) //如果是则
{
RxDataNum = 0;
TIM2->IER &= ~TIM2_IER_CC1IE; //1、关 比较中断
//STM8S没有外中断标志位,STM8L有标志位,因此暂时不需要清中断标志位
SimUART_PORT->CR2 |= 0x08; //2、开 IO中断
//处理有效数据
if( (RxDataValue & 0x0402) == 0x0400 )
{
RxDataValue_Temp = ( RxDataValue >> 2 );
RxData_ValidNum++;//接收字有效 节数
RXData[count++] = RxDataValue_Temp;
if(count>2)
{
for(unsigned char i = 0; i<count;i++)
{
//RXData[i] =RxData1[i];
}
flagpacker = 1;//告诉系统已接收一个完整的数据包
count=0;
}
}
}
}
|
|