STM32 F103C8T6学习笔记3:串口配置 |
您所在的位置:网站首页 › ad中db9串口在哪个库 › STM32 F103C8T6学习笔记3:串口配置 |
今日学习使用STM32 C8T6的串口,我们在经过学习笔记2的总结归纳可知,STM32 C8T6最小系统板上有三路串口,如下图: 今日我们就着手学习如何配置开通这些串口进行收发,这里不讲串口通信概念与基础,可以自行网上查找,本文直接开始介绍库函数与编程实现: 串口配置相关库函数介绍: 打开串口GPIO的时钟: void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) /* #define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) #define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) #define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) #define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) #define RCC_APB2Periph_GPIOF ((uint32_t)0x00000080) #define RCC_APB2Periph_GPIOG ((uint32_t)0x00000100) */ 打开串口外设的时钟: void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) /* #define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) #define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) #define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) #define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) #define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) */ 串口的初始化配置: void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) /* USART1 USART2 USART3 */ 向量中断控制器组选择: void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 初始化配置NVIC: void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) 串口接收: USART_ReceiveData(USART1) 串口配置编程:首先创建好要用的几个文件.c 与.h,在添加进工程,别忘了添加路径~ 以下是串口1的初始化以及配置中断优先级,中断优先级的配置分为主优先和子优先,有关中断优先级的配置这放在以后再说~~~, 测试工程文件我还编写了串口2,3的初始化,可以下载测试观察~ #include "USART_init.h" void Usart1_Init(unsigned int baud) { GPIO_InitTypeDef gpio_initstruct; USART_InitTypeDef usart_initstruct; NVIC_InitTypeDef nvic_initstruct; // 打开串口GPIO的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 打开串口外设的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //PA9 TXD // 将USART Tx的GPIO配置为推挽复用模式 gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP; gpio_initstruct.GPIO_Pin = GPIO_Pin_9; gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio_initstruct); //PA10 RXD // 将USART Rx的GPIO配置为浮空输入模式 gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpio_initstruct.GPIO_Pin = GPIO_Pin_10; gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio_initstruct); usart_initstruct.USART_BaudRate = baud; //配置波特率 usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控 usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送 usart_initstruct.USART_Parity = USART_Parity_No; //无校验 usart_initstruct.USART_StopBits = USART_StopBits_1; //配置停止位 1位停止位 usart_initstruct.USART_WordLength = USART_WordLength_8b; //配置 针数据字长 8位数据位 // 完成串口的初始化配置 USART_Init(USART1, &usart_initstruct); USART_Cmd(USART1, ENABLE); //使能串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 嵌套向量中断控制器组选择 */ nvic_initstruct.NVIC_IRQChannel = USART1_IRQn; /* 配置USART为中断源 */ nvic_initstruct.NVIC_IRQChannelCmd = ENABLE; /* 使能中断 */ nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0; /* 抢断优先级*/ nvic_initstruct.NVIC_IRQChannelSubPriority = 2; /* 子优先级 */ NVIC_Init(&nvic_initstruct); /* 初始化配置NVIC */ } 串口中断服务函数的编写:首先在启动文件找到三个串口的中断服务函数: https://download.csdn.net/download/qq_64257614/88201777?spm=1001.2014.3001.5503 自定义Printf函数:以下是一个可以直接调用的自定义Printf函数,用于串口打印,除了需要多传入一个串口号的蚕食外,其余格式与Printf相同: 注意需要添加以下头文件: #include "stdarg.h" //自定义printf需要使用 #include "stdio.h" //1.61328125kb //选择串口发送数据--自定义Printf void UsartPrintf (USART_TypeDef *USARTx, char *fmt,...) { unsigned char UsartPrintfBuf[296]; //最大长度296 va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART_SendData(USARTx, *pStr++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); } }
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |