串口寄存器配置

xiaoxiao2021-02-28  48

串口操作相关库函数

void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能

void USART_Cmd();//使能串口

void USART_ITConfig();//使能相关中断

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

FlagStatusUSART_GetFlagStatus();//获取状态标志位

void USART_ClearFlag();//清除状态标志位

ITStatusUSART_GetITStatus();//获取中断状态标志位

void USART_ClearITPendingBit();//清除中断状态标志位

typedef struct { uint32_t USART_BaudRate; /*设置波特率,对应寄存器USART_BRR */ uint16_t USART_WordLength; /*指定数据长度,对应寄存器USART_CR1的位12 */ uint16_t USART_StopBits; /*指定停止位的位数,对应寄存器USART_CR2的位13:12 */ uint16_t USART_Parity; /*指定校验方式,对应寄存器USART_CR1的位10:9 */ uint16_t USART_Mode; /*指定了USART的位数,对应寄存器USART_CR2的位13:12*/ uint16_t USART_HardwareFlowControl; /*使能或失能CTS硬件流控制,对应寄存器USART_CR3的位9 */ } USART_InitTypeDef; 串口配置的一般步骤: 串口时钟使能, GPIO 时钟使能 : RCC_APB2PeriphClockCmd();串口复位 : USART_DeInit (); 这一步不是必须的GPIO 端口模式设置 : GPIO_Init (); 模式设置为 GPIO_Mode_AF_PP,复用推挽。串口参数初始化 USART_Init ();开启中断并且初始化 NVIC (如果需要开启中断才需要这个步骤)

      NVIC_Init();

      USART_ITConfig();

使能串口:USART_Cmd();

编写中断处理函数USARTx_IRQHandler();

⑧串口数据收发:

void USART_SendData();//发送数据到串口,DR

uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

⑨串口传输状态获取:

FlagStatusUSART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);

voidUSART_ClearITPendingBit(USART_TypeDef*USARTx, uint16_t USART_IT);

/* void My_USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择要控制的GPIOA引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //设置引脚速率为10MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置引脚模式为通用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择要控制的GPIOA引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //设置引脚速率为10MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置引脚模式为浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数,初始化GPIOA USART_InitTypeDef USART_InitStructure; //定义USART初始化类型结构体 USART_InitStructure.USART_BaudRate = 115200; //波特率设为115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //1个起始位,8个数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; //无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//失能CTS USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收 USART_Init(USART1, &USART_InitStructure); //调用库函数,初始化USART1 USART_Cmd(USART1, ENABLE); //使能USART1 USART_ITConfig(USART1,USART_TI_RXNE,ENABLE); //开启接收中断 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //配置中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//配置响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //NVIC使能 NVIC_Init(&NVIC_InitStructure);//向寄存器写入参数 } void USART1_IRQHandler(() { u8 res if(USART_GetFlagStatus(USART1,USART_TI_RXNE)) { USART_ReceiveData(USART1); USART_SendData(USART1,res); } } int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC的优先级为4种抢占优先级和4种响应优先级 My_USART1_Init(); while(1); } */
转载请注明原文地址: https://www.6miu.com/read-999998.html

最新回复(0)