有关于STM32串口中断的问题

2019-07-21 02:36发布

今天我把PWM试验和串口通讯试验做了一些小修改,实现了用XCOM输入0-100发送给STM32让其做出相应占空比PWM波形。虽然我的试验时成功了。但是我还有几个小问题搞不明白。希望各位前辈赐教。
串口的函数我只修改了#define USART_REC_LEN   2   //定义最大接收字节数 2      。然后自己加了一个ASCII码转十进制码的小函数。u8 Ascii_decimalDate(u8 udat,u8 udat1);返回值就是Xcom输入的数字(0-100)。
主函数我就是除了一些初始化外,while(1)里面就是 [mw_shl_code=c,true] while(1) { if(USART_RX_STA&0x8000) { { // len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 for(t=0;t<2;t++) { USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //等待发送结束 } printf(" "); //插入换行 USART_RX_STA=0; } } led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]); TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比 USART_RX_STA=0; } }[/mw_shl_code]   这个就可以成功我的试验。
 然后我把原子哥的那条发送的函数删了!成了下面 [mw_shl_code=c,true] [mw_shl_code=c,true] while(1) { led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]); TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比 USART_RX_STA=0; }[/mw_shl_code] 就这三条,后来发现无论我用XCOM怎么发数据,结果灯就是不变亮度,我也不知道为什么会这样。[/mw_shl_code] [mw_shl_code=c,true]然后我认为是主函数没有进入(因为那个接收中断我用LED1翻转只是没错误),所以我吧函数有多加了几条 [mw_shl_code=c,true] while(1) { led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]); TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比 USART_RX_STA=0; delay_ms(1000);TIM_SetCompare1(TIM14,0); delay_ms(1000); }[/mw_shl_code] 这样我观察了一下,我用XCOM发数据,LED闪烁也会改变亮度,所以我认为没进主程序是错误的。然后我就吧程序改成了下面 [mw_shl_code=c,true] while(1) { led0pwmval = Ascii_decimalDate(USART_RX_BUF[1],USART_RX_BUF[0]); TIM_SetCompare1(TIM14,led0pwmval*5); //修改led0pwmval,修改占空比 USART_RX_STA=0; delay_ms(10); }[/mw_shl_code] 就多加了个10ms延时, 问题居然就解决了, 我辛苦了一下午,为什么。[/mw_shl_code] [mw_shl_code=c,true]1、我想请教为什么加10MS延时就可以成功了?[/mw_shl_code] [mw_shl_code=c,true]2、这十秒延时意义是什么, 有什么重要含义, 以后写程序是不是要多注意这个10ms,我看原子哥程序也有过好多10MS延时的,这是不是个好习惯?[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。