cw32l083的uart是没有空闲中断的,这样给接收数据帧带来一定的不便。比如我们需要用的at指令,那么判断接收完一条完整的指令,可以用串口断+结尾rn来判断接收完一条完整指令。但是这个方法有一个缺点就是返回两个rn 时就会处理起来非常麻烦。
这是我用串口中断+定时器来实现 如空闲中断的接收,而且可以灵活的处理接收最后一个数据后的延时来判是否接收完整一条指令。
【实现方法】
1、初始化串口5,开配置波特率为115200,开启接收中断。
static void serialinit(uint32_t baudrate){uint32_t pclk_freq;gpio_inittypedef gpio_initstructure = {0};uart_inittypedef uart_initstructure = {0};pclk_freq = systemcoreclock > > pow2_table[cw_sysctrl- >cr0_f.hclkprs];pclk_freq > >= pow2_table[cw_sysctrl- >cr0_f.pclkprs];// 调试串口使用uart5// pb8- >tx// pb9arr = 40000-1; cw_gtim1- >cr0_f.en = 1; } else { uart5_infor.rx_cnt = 0; memset(uart5_infor.rx_buff, 0, uart_len_max); } uart5_infor.rx_cnt ++; uart_clearitpendingbit(cw_uart5, uart_it_rc); } /* user code end */}5、定时器函数为,如果触发中断,清除中断标志,把接收完整数据值置为真:
/** * @brief this funcation handles gtim1 */void gtim1_irqhandler(void){ /* user code begin */ if(gtim_getitstatus(cw_gtim1, gtim_it_ov)) { gtim_clearitpendingbit(cw_gtim1, gtim_it_ov); uart5_infor.rx_state = enable; } /* user code end */}6、在主函数中,我们判断接收状态是否为真,如果为真则打印出接收的数值,并且重置串口数据。
while (1) { if(uart5_infor.rx_state == enable) { printf(uart5 recv cnt:%drn, uart5_infor.rx_cnt); printf(uart5 recv cnt:%srn, uart5_infor.rx_buff); uart5_infor_init(); } // gpio_togglepin(cw_gpioc, gpio_pin_2); // rt_thread_mdelay(500); rt_thread_mdelay(10); }【实验效果】
我们发送不定长数据,正确的从串口返回数据:
【总结】
用定时器与串口中断结合起来,完美的实现了串口的不定长接收。
家里的wifi是局域网吗?
安兔兔排行榜出炉:iphone 7毫无对手,一加3T傲视国产群雄
Windows10虽好,但大多数人都愿意用windows7原因在哪里?
大家都在用的一种轴承室磨损修复技术
新型的铁塔基站“能源管家”
CW32L083串口中断+定时器实现不定长数据接收
电动汽车采用轮毂电机驱动技术原因
CC2640R2:如何利使用芯片内部Bootloader烧写程序
Zybo Board 开发记录: Xilinx SDK 在 Linux 的一些注意事项
夏天防晒单品好选择,遮阳帽品牌排行榜了解下
NB-IoT无线温湿度检测设备纵横通第七代更新产品简介
ofo依然没能等来奇迹,现在的ofo可以说已经无力回天
笔记本电脑一蹶不振成为台湾经济新威胁 瞄准物联网
美国断供华为 三星是否渔翁得利
华为nova4e值不值得买
日本正在开发VR味觉设备 既能过嘴瘾又不用担心身体
Imagination推出IMG CXM最小GPU,为家庭娱乐带来无比便捷的用户界面
为保住美国领先地位,英特尔等芯片制造商将获得美政府250亿美元补贴
交流接触器和直流接触器的区别在哪
基于VxWorks嵌入式实时操作系统ARM9核芯片中实现BSP的定制过程