X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
国产芯片交流
[MCU] 【CW32L052R8T6 】学习笔记05-串口的接收中断+空闲中断
chejia12
2023-7-16 22:42
楼主
#空闲中断 串口空闲中断需要操作寄存器,没有对应和函数 ## 空闲中断涉及的知识要点
## 初始化代码 ```c void bsp_enable_idle() { DEBUG_UARTx->CR2_f.TIMCR = 0x3; DEBUG_UARTx->IER_f.TIMOV=1; DEBUG_UARTx->TIMARR=0xff; } ``` ## 中断处理处理办法 ```c void UART2_IRQHandler() { uint8_t TxRxBuffer; if(UART_GetITStatus(DEBUG_UARTx, UART_IT_RC) != RESET) { TxRxBuffer = UART_ReceiveData_8bit(DEBUG_UARTx); // UART_SendData_8bit(DEBUG_UARTx, TxRxBuffer); UART_ClearITPendingBit(DEBUG_UARTx, UART_IT_RC); } //以下就是空闲中断的处理 else if(UART_GetITStatus(DEBUG_UARTx, 0x200) != RESET) { //这里需要重新设置,否则只执行一次接收空闲中断检测 DEBUG_UARTx->CR2_f.TIMCR = 0x3; UART_ClearITPendingBit(DEBUG_UARTx, 0x200); bsp_led_blink(); } } ``` ## 实例函数 ### uart_it_idle.h ```c #ifndef __BSP_UART_TI_H_ #define __BSP_UART_TI_H_ #include
#include
#include "cw32l052_gpio.h" #include "cw32l052_rcc.h" #include "cw32l052_uart.h" //UARTx #defineDEBUG_UARTx CW_UART2 #defineDEBUG_UART_CLK RCC_APB1_PERIPH_UART2 #defineDEBUG_UART_APBClkENx RCC_APBPeriphClk_Enable1 #defineDEBUG_UART_BaudRate 9600 #defineDEBUG_UART_UclkFreq 8000000 //UARTx GPIO #defineDEBUG_UART_TX_GPIO_CLK RCC_AHB_PERIPH_GPIOC #defineDEBUG_UART_RX_GPIO_CLK RCC_AHB_PERIPH_GPIOD #defineDEBUG_UART_TX_GPIO_PORT CW_GPIOC #defineDEBUG_UART_TX_GPIO_PIN GPIO_PIN_12 #defineDEBUG_UART_RX_GPIO_PORT CW_GPIOD #defineDEBUG_UART_RX_GPIO_PIN GPIO_PIN_2 //GPIO AF #defineDEBUG_UART_AFTX PC12_AFx_UART2TXD() #defineDEBUG_UART_AFRX PD02_AFx_UART2RXD() //中断 #defineDEBUG_UART_IRQ UART2_IRQn void bsp_uart_it_init(void); void bsp_it_send_recv_test(void); #endif ``` ### uart_it_idle.c ```c #include "uart_it.h" #include "led.h" /** *
@brief
配置RCC * */ static void RCC_Configuration(void) { //SYSCLK = HSI = 8MHz = HCLK = PCLK RCC_HSI_Enable(RCC_HSIOSC_DIV6); //外设时钟使能 RCC_AHBPeriphClk_Enable(DEBUG_UART_TX_GPIO_CLK, ENABLE); RCC_AHBPeriphClk_Enable(DEBUG_UART_RX_GPIO_CLK, ENABLE); DEBUG_UART_APBClkENx(DEBUG_UART_CLK, ENABLE); } /** * @brief 配置GPIO * */ static void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; //UART TX RX 复用 DEBUG_UART_AFTX; DEBUG_UART_AFRX; GPIO_InitStructure.Pins = DEBUG_UART_TX_GPIO_PIN; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_Init(DEBUG_UART_TX_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pins = DEBUG_UART_RX_GPIO_PIN; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; GPIO_Init(DEBUG_UART_RX_GPIO_PORT, &GPIO_InitStructure); } /** * @brief 配置UART * */ static void UART_Configuration(void) { UART_InitTypeDef UART_InitStructure = {0}; UART_InitStructure.UART_BaudRate = DEBUG_UART_BaudRate; UART_InitStructure.UART_Over = UART_Over_16; UART_InitStructure.UART_Source = UART_Source_PCLK; UART_InitStructure.UART_UclkFreq = DEBUG_UART_UclkFreq; UART_InitStructure.UART_StartBit = UART_StartBit_FE; UART_InitStructure.UART_StopBits = UART_StopBits_1; UART_InitStructure.UART_Parity = UART_Parity_No ; UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None; UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx; UART_Init(DEBUG_UARTx, &UART_InitStructure); } /** * @brief 配置NVIC * */ void NVIC_Configuration(void) { //优先级,无优先级分组 NVIC_SetPriority(DEBUG_UART_IRQ, 0); //UARTx中断使能 NVIC_EnableIRQ(DEBUG_UART_IRQ); } void enable_idle() { DEBUG_UARTx->CR2_f.TIMCR = 0x3; DEBUG_UARTx->IER_f.TIMOV=1; DEBUG_UARTx->TIMARR=0xff; } void bsp_uart_it_init(void) { //配置RCC RCC_Configuration(); //配置GPIO GPIO_Configuration(); //配置UART UART_Configuration(); enable_idle(); //使能UARTx RC中断 UART_ITConfig(DEBUG_UARTx, UART_IT_RC, ENABLE); //配置NVIC NVIC_Configuration(); } void bsp_it_send_recv_test() { UART_SendString(DEBUG_UARTx, "\r\nCW32L052 UART Interrupt\r\n"); } int fputc(int ch, FILE* f) { UART_SendData_8bit(DEBUG_UARTx, ch); while(UART_GetFlagStatus(DEBUG_UARTx, UART_FLAG_TXE) == RESET); return (ch); } void UART2_IRQHandler() { uint8_t TxRxBuffer; if(UART_GetITStatus(DEBUG_UARTx, UART_IT_RC) != RESET) { TxRxBuffer = UART_ReceiveData_8bit(DEBUG_UARTx); // UART_SendData_8bit(DEBUG_UARTx, TxRxBuffer); UART_ClearITPendingBit(DEBUG_UARTx, UART_IT_RC); } else if(UART_GetITStatus(DEBUG_UARTx, 0x200) != RESET) { //这里需要重新设置,否则只执行一次接收空闲中断检测 DEBUG_UARTx->CR2_f.TIMCR = 0x3; UART_ClearITPendingBit(DEBUG_UARTx, 0x200); bsp_led_blink(); } } ```
点赞
回复评论 (3)
沙发
Jacktang
串口空闲中断需要操作寄存器,没有对应和函数还真不好处理
楼主的思路不错
点赞
2023-7-17 07:30
板凳
lugl4313820
我在前面配置好DEBUG_UARTx->CR2_f.TIMCR = 0x3;在debug下面是没有设置成功的。
点赞
2023-7-17 08:34
4楼
lugl4313820
不知道楼主试验成功了没有,如果成功的话分享一下工程,我学习一下。
点赞
2023-7-17 08:35
最新活动
STM32N6终于要发布了,ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
随便看看
飞思卡尔致力于简化8位应用开发
STM32捕获寄存器的值实时在变,为什么?
MM32开发板测评等你来!
【求助】关于msp430f149与msp430f169在用proteus8.0中仿真时的选择
本周话题:聊聊PID,说说你的体会。附送精品PID资料两枚
易电源纳米模块接反会烧毁,其他人也多注意吧
MSP430 LaunchPad 8X8点阵显示
PCB设计者必看资料
回收HP53220A 频率计数器
开源机器人操作系统——ros经典教程
CC4012------双4输入与非门
如果你的wifi能发送邮件,你会用来干嘛呢?
未来十年,手机还能做啥?
STR7与5V系统接口问题?
MSP430 ADC采样问题
如何写好状态机
区块链葡萄干
转让PICKit3 送简易开发板
路过瞧瞧,嘿嘿
iar xcl文件错误
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复