对于USART,我们可以直接根据示例代码修改而来。这里选择usart1.
1.确定USART1的引脚。
可以从GPIO引脚分配图中选择USART1的pin脚,这里选择PB5和PB6作为USART1的TX和RX。
下面对usart1进行初始化
void uart_init(void)
{
UART_SettingType uartSetting;
GPIO_SetFunc(GPIO_PB5, 1);//设置PB5为uart功能
GPIO_SetFunc(GPIO_PB6, 1);//设置PB6为uart功能
uartSetting.baudrate = 115200;//设置波特率
uartSetting.dataBits = 8;
uartSetting.stopBits = 1;
uartSetting.parity = 0;
uartSetting.fifoByte = ENABLE;//使能缓冲区
uartSetting.dmaEn = DISABLE;//dma不使能
UART_Init(UART1, &uartSetting);//初始化串口
UART_SetEventCallback(UART1, UART_IRQHandler);//设置中断回调函数
UART_SetRxIntEn(UART1, ENABLE);//使能接收中断
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_EnableIRQ(UART1_IRQn);
}
如上设置使能了串口接收中断,回调函数如下:
int32_t UART_IRQHandler(uint8_t port, uint32_t LSR0, uint32_t LSR1)
{
if ((UART1->UARTn_IER.ERXNE == 1) && (LSR0 & LSR0_DR))
{
rx_table[step++]=UART_ReceiveData(UART1);
}
if ((UART1->UARTn_IER.ETXE == 1) && (LSR0 & LSR0_THRE))//发送数据
{
}
return 0;
}
串口发送函数:
void UART_SendString(uint8_t *pDataBuf, uint8_t dataLen)
{
for (uint8_t ii = 0; ii < dataLen; ii++)
{
UART_SendData(UART1, pDataBuf[ii]);//发送一个byte
while(!UART1->UARTn_LSR0.TC);//等待发送完成
}
}
主函数:
int main(void)
{
//SetSysClock();
InitDelay();
led_init();
uart_init();
exti_init();
//pwm_gpio_init();
//PWM1_GenerateFrequency();
GPIO_SetPinValue(GPIO_PA0, 1);
while(1)
{
mdelay(1000);
UART_SendString((uint8_t*)"uart1 test...",sizeof("uart1 test...")-1);
GPIO_SetPinValue(GPIO_PA0, 0);
}
}
效果如下::
|