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; } } } } |
STM8S003F3U6 请求各位大佬支援,但是遇到如下问题。。。这样就一定是这颗芯片的问题吗?
STVD如何生成库文件
STM8 flash 库函数 startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_S
stm 8 flash 在RAM运行代码的问题,是不是库函数有问题 Library call (?sll32_l0_l0_a) from within a
STM 有能替代MCHC912B32CFUE8 / NXP的型号吗?
STM8S的CAN总线使用
STM8L151在使用DAC功能后严重发热
STM8 IIC SLAVE 400K
STM8S 定时器1互补输出pwm
STM8S003F3 NRST电压低,无法开机
评分
查看全部评分