1. 串口概述
通信的总线。UART串口属于异步串行全双工总线。
1.1 串口连接方式
1.2 串口的通信协议
空闲态为高电平
起始位为低电平,表示开始
数据位可以设置,一般设置为8位
校验位有奇校验和偶校验,奇校验根据数据位中的1的个数,如果为奇数,校验位补0
如果为偶数,校验位补1。偶校验根据1的个数,如果为奇数,校验位为1,如果为偶数
校验位补0;
停止位为低电平。
校验位可以选择不校验。
2. 板子上的电路图串口
3. 数据手册分析
3.1 gpio
3.2 uart
串口的发送
串口的发送
、
串口波特率的公式,可知BRR寄存器设置为USARTDIV的值。
那么只要知道这个值,就可以设置成想要的波特率了
分析到这里,下边我们开始写代码
3. 代码实例
uart.c
#include "uart.h"
void Uart_Init()
{
//1创建gpio还有uart的初始化结构体
GPIO_InitTypeDef txinit; //pa9;
GPIO_InitTypeDef rxinit; //pa10
USART_InitTypeDef uart_init;
NVIC_InitTypeDef nvic_Init;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//2时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//gpio时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用功能使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能
//3gpio初始化
txinit.GPIO_Mode = GPIO_Mode_AF_PP;
txinit.GPIO_Pin = GPIO_Pin_9;
txinit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &txinit);
rxinit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
rxinit.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &rxinit);
//4uart初始化
uart_init.USART_BaudRate = 115200;
uart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
uart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
uart_init.USART_Parity = USART_Parity_No ;
uart_init.USART_StopBits = USART_StopBits_1;
uart_init.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &uart_init);
USART_Cmd(USART1, ENABLE);
USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);
//中断初始化
nvic_Init.NVIC_IRQChannel = USART1_IRQn;
nvic_Init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_Init.NVIC_IRQChannelSubPriority = 1;
nvic_Init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_Init);
}
void sendstr(uint8_t *str)
{
int i = 0;
while(i < 128)
{
USART_SendData(USART1, str[i]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
if(str[i] == '\0')
{
break;
}
i++;
}
USART_SendData(USART1, '\n');
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1, '\r');
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
main.c
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return (ch);
}
uint8_t str[128];
int main()
{
uint8_t ch;
LED_Init();
Key_Init();
//beap_Init();
Relay_Init();
Shake_Init();
Exti_Init();
Uart_Init();
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_7);
//strcpy((char *)str,"hello world!");
while(1)
{
//sendstr(str);
//printf("hello\r\n");
//while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
// str[i] = USART_ReceiveData(USART1);
//i++;
//USART_SendData(USART1, ch);
//while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
delay(500);
//USART_SendData(USART1, 'o');
//while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
//delay(500);
}
}
void EXTI1_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line1) != RESET)//判断是否发生中断
{
GPIO_ResetBits(GPIOB, GPIO_Pin_7);
delay(1000);
GPIO_SetBits(GPIOB, GPIO_Pin_7);
}
EXTI_ClearFlag(EXTI_Line1);
}
void USART1_IRQHandler(void){
char ch;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
str[i] = USART_ReceiveData(USART1);
i++;
if(i == 3)
{
i = 0;
if(strcmp((char *)str,"off") == 0)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(1000);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
}
}