一、復制一份工種到新的文件夾: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
+關注
關注
242文章
23252瀏覽量
660561 -
uart
+關注
關注
22文章
1235瀏覽量
101354 -
Ubuntu
+關注
關注
5文章
563瀏覽量
29704 -
GPIO
+關注
關注
16文章
1204瀏覽量
52051
發布評論請先 登錄
相關推薦
評論