采用标准库 主控STM32F103C8T6
03代码:
#include "main.h"
#include "led/led.h"
#include "exit/exit.h"
#include "uart/uart.h"int main()
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);InitLED();InitExit();InitUart();SendChar('A');SendBuf("12345678dddÄãʦµÜ\r\n");printf("qwerrdÎÒµÄÍÞ1222\r\n");while(1){}}
uart.c
#include "uart/uart.h"void InitUart(void)
{GPIO_InitTypeDef GPIO_InitTypeDefStruct;USART_InitTypeDef USART_InitTypeDefStruct;NVIC_InitTypeDef NVIC_InitTypeDefStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);GPIO_InitTypeDefStruct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitTypeDefStruct.GPIO_Pin=GPIO_Pin_9;GPIO_InitTypeDefStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitTypeDefStruct);GPIO_InitTypeDefStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitTypeDefStruct.GPIO_Pin=GPIO_Pin_10;GPIO_InitTypeDefStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitTypeDefStruct);USART_InitTypeDefStruct.USART_BaudRate=115200;USART_InitTypeDefStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitTypeDefStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitTypeDefStruct.USART_Parity=USART_Parity_No;USART_InitTypeDefStruct.USART_StopBits=USART_StopBits_1;USART_InitTypeDefStruct.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitTypeDefStruct);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_Cmd(USART1,ENABLE);NVIC_InitTypeDefStruct.NVIC_IRQChannel=USART1_IRQn;NVIC_InitTypeDefStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitTypeDefStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitTypeDefStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitTypeDefStruct);}void USART1_IRQHandler(void)
{uint8_t data;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){data=USART_ReceiveData(USART1);SendChar(data);}USART_ClearITPendingBit(USART1,USART_IT_RXNE);
} void SendChar(uint8_t data)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,data);
}void SendBuf(uint8_t *data)
{while(*data!='\0'){while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,*data);data++;}
}
int fputc(int ch,FILE *f)
{while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,(uint8_t)ch);return ch;
}
uart.h
#include "main.h"void InitUart(void);
void SendChar(uint8_t data);
void SendBuf(uint8_t *data);
int fputc(int ch,FILE *f);
串口初始化流程:
初始化IO口 在中文参考手册8.1.11中可以看到
初始化UART结构体 别忘记开中断
初始化NVIC
中断函数编写
接收数据寄存器为空的时候接收数据,在GetITStatus中默认是RESET,默认==RESTE是接收数据寄存器非空,所以要让接收数据寄存器为空才行 所以!=
发送数据寄存器为空 在GetITStatus中默认是RESET,所以直接==即可
Printf()重定向 需要添加<stdio.h>头文件
然后重写 fputc函数
重定向到UART
勾选微库
就可以使用printf(“”)打印了
遇到中文乱码 需要设置keil里面为ANSI 和main.c重新保存为ANSI格式,因为在keil里面创建的mian.c文件格式是UTF8的,要换格式为ANSI,所以要另存为选择ANSI并覆盖现有的