hc32l136 uart int实现例码
时间: 2023-12-20 12:04:50 浏览: 119
以下是HC32L136 MCU使用UART中断实现发送接收数据的示例代码:
```c
#include "hc32l136.h"
#include "stdio.h"
#define UART_RX_BUFFSIZE 64U
volatile uint8_t u8RxData[UART_RX_BUFFSIZE];
volatile uint8_t u8RxCnt;
void UartRxIntCallback(void)
{
uint8_t u8RxByte;
if (Set == USART_GetStatus(USART_CH1, USART_FLAG_RXNE))
{
u8RxByte = USART_RecData(USART_CH1);
u8RxData[u8RxCnt++] = u8RxByte;
}
}
void UartTxIntCallback(void)
{
if (Set == USART_GetStatus(USART_CH1, USART_FLAG_TXE))
{
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Disable);
}
}
int main(void)
{
stc_gpio_config_t stcLEDPortCfg;
stc_usart_config_t stcUSARTCfg;
stc_uart_irq_cb_t stcUartIrqCb;
/* 使能外设时钟 */
CLK_FcgPeriphClockCmd(CLK_FCG_UART1, Enable);
/* 配置GPIO */
GPIO_StructInit(&stcLEDPortCfg);
stcLEDPortCfg.u16PinCfg = PIN_OD;
GPIO_Init(GPIOD, GPIO_PIN_4, &stcLEDPortCfg);
/* 配置UART */
USART_StructInit(&stcUSARTCfg);
stcUSARTCfg.u32Baudrate = 115200U;
stcUSARTCfg.u32ClkMode = USART_INTERNCLK_NONE_OUTPUT;
stcUSARTCfg.u32StopBit = USART_STOP_BIT_1;
stcUSARTCfg.u32CharWidth = USART_CHAR_WIDTH_8BIT;
USART_Init(USART_CH1, &stcUSARTCfg);
/* 使能UART接收中断 */
USART_FuncCmd(USART_CH1, USART_INT_RXNE, Enable);
/* 使能全局中断 */
EnableNvic(INT_USART1_2_3_4_5_6_7_8, IrqLevel3, DDL_IRQ_ENABLE);
while (1)
{
/* 发送字符串 */
u8TxByte = 'H';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = 'e';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = 'l';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = 'l';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = 'o';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = '\r';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
u8TxByte = '\n';
USART_SendData(USART_CH1, u8TxByte);
USART_FuncCmd(USART_CH1, USART_INT_TXE, Enable);
/* 接收数据 */
if (u8RxCnt > 0U)
{
printf("Received data: ");
for (uint8_t i = 0U; i < u8RxCnt; i++)
{
printf("%c", u8RxData[i]);
}
printf("\r\n");
/* 清除接收缓冲区 */
u8RxCnt = 0U;
}
}
}
/**
* @brief USART RX IRQ callback function.
* @param None
* @retval None
*/
void USART_RX_IrqCallback(void)
{
UartRxIntCallback();
}
/**
* @brief USART TX IRQ callback function.
* @param None
* @retval None
*/
void USART_TX_IrqCallback(void)
{
UartTxIntCallback();
}
```
在上面的示例代码中,我们首先定义了一个缓冲区和计数器,用于接收从UART接收到的数据。然后,我们在主函数中进行了初始化,包括配置GPIO和UART、使能UART接收中断和全局中断等。在主循环中,我们通过发送数据来测试UART是否正常工作,并通过接收中断来接收数据。如果接收到了数据,则将其打印到终端,并清空接收缓冲区。
需要注意的是,在本示例代码中,我们仅使用了USART_CH1进行UART通信。如果您需要使用其他UART通信,需要相应地更改代码。
阅读全文