一、复制一份工种到新的文件夹:sudo cp -r cw32l031_uart cw32l031_uart_iqr,然后给新的文件夹赋予读写权限:sudo chmod 777 -R cw32l031_uart_iqr/
二、用VSCode打开该工程文件夹
三、在usre_uart.c中增加中断的配置
NVIC_SetPriority(UART1_IRQn, 0); //优先级,无优先级分组
NVIC_EnableIRQ(UART1_IRQn); //UARTx中断使能
四、修改中断函数
主要的思路是:
1、如果进入了中断,首先判断是不是UART1的接收中断,如果是则接收一个字节数的数据。
2、如果接收超过了最长长度,则计数归零,如果接收到了’\\n’说明接收一次数据完成,更新标志位。
3、清除接收标志位。
void UART1_IRQHandler(void)
{
/* USER CODE BEGIN */
if(USART_GetITStatus(CW_UART1, USART_IT_RC) != RESET) // 获取UARTx中断标志位
{
rx_buff[rx_cnt] = USART_ReceiveData_8bit(CW_UART1);
//如果接收达到上限,则回到0
if(rx_buff[rx_cnt] == '\\n')
{
rx_state = 1;
}
if(rx_cnt < UART_RX_MAX_LEN)
{
rx_cnt ++;
}
else
{
rx_cnt = 0;
}
USART_ClearITPendingBit(CW_UART1, USART_IT_RC);
}
/* USER CODE END */
}
五、要main主函数中,我们判断是否接收完数据,如果接收完数据,则进来判断,如果是LED_ON则点亮LED灯,如果是LED_OFF则关断LED灯。
Main主函数代码如下:
int main(void)
{
LED_Init();
LogInit();
USART_ITConfig(CW_UART1, USART_IT_RC, ENABLE);
InitTick(24000000ul); //初始化SysTick
// 开启两线调试接口
RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);
printf("start\\r\\n");
while (1)
{
if(rx_state == 1)
{
printf("recv: %s\\r\\n", rx_buff);
rx_state = 0;
rx_cnt = 0;
if (rx_buff[0] == 'L' && \\
rx_buff[1] == 'E' && \\
rx_buff[2] == 'D' && \\
rx_buff[3] == '_' && \\
rx_buff[4] == 'O' && \\
rx_buff[5] == 'N' )
{
GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_RESET);
}
else if (/* condition */rx_buff[0] == 'L' && \\
rx_buff[1] == 'E' && \\
rx_buff[2] == 'D' && \\
rx_buff[3] == '_' && \\
rx_buff[4] == 'O' && \\
rx_buff[5] == 'F' && \\
rx_buff[6] == 'F' )
{
GPIO_WritePin(CW_GPIOC, GPIO_PIN_13, GPIO_Pin_SET);
}
memset(rx_buff, 0, UART_RX_MAX_LEN);
}
// GPIO_TogglePin(CW_GPIOC, GPIO_PIN_13);
SysTickDelay(10);
}
return 0;
}
实验效果,发送LED_ON板载的LED亮,发送LED_OFF板载的LED关断。同时打印出发送的内容。
审核编辑:汤梓红
-
led
+关注
关注
240文章
23060浏览量
656988 -
uart
+关注
关注
22文章
1219浏览量
101112 -
Ubuntu
+关注
关注
5文章
559浏览量
29496 -
GPIO
+关注
关注
16文章
1188浏览量
51828
发布评论请先 登录
相关推荐
评论