STM32单片机学习手记
始化端口的,我们把它复制到main.c中,并且把它改名为 void STM_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct) 去掉中间的eval。 当然,在main函数中调用这个函数的地方也要做相应的修改。 这个函数中用到了如上图中蓝色框中的一些符号,又是一系列的转换,用刚才所说的跟踪方法,找到这些符号的原始出处,作出修改,最后得到的STM_COMInit函数如下: void STM_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct) { GPIO_InitTypeDef GPIO_InitStructure; /* 打开UART所用到的GPIO引脚的时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); /* 打开UART的时钟*/ if (COM == COM1) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); } else //COM=COM2 { RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); } /* 配置TX引脚为推挽式输出 */ if(COM==COM1) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ; else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); /* 配置RX引脚为浮动输入(高阻?) */ if(COM==COM1) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; else GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); /* 串行口配置*/ if(COM==COM1) USART_Init(USART1, USART_InitStruct); else USART_Init(USART2, USART_InitStruct); /* 串口允许*/ if(COM==COM1) USART_Cmd(USART1, ENABLE); else USART_Cmd(USART2, ENABLE); } 至此,修改基本结束,在工程中移去stm32_eval相关的各个文件,在APP文件夹中将这些文件删除,关闭工程,再重新打开工程,编译通过,运行通过。 下面对上述初始化工作做一些解读,当然,少不了要数据手册的帮忙了。 (1)UART1的时钟来源和其他串口的时钟来源不同,UART1的时钟来源是:APB2,其他串口的时钟来源:APB1。 (2)用于UART通信的引脚不会自动配置,需要手工配置。其中用于输出信号的引脚TX必须配置成为推挽式输出,而RX引脚则配置成浮动型输入。 (3)串口波特率、停止位等参数由库提供的stm32f10x_usart.c中的 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) 函数来设定。 观察这个函数的执行,可以看到函数通过对CR2寄存器的操作来设定停止位,如下图蓝色框中所示。 通过对CR1寄存器的设定来确定数据位/奇偶校验位等,这些都只需要找到相应的符号,就能顺利地进行设置,找到符号的方法,当然还是上面的按F12浏览的方法。 还有一个重要的工作是波特率的计算,且看这里是如何来做的。 下面这一段是波特率设置的代码 首先根据usartxbase的值来确定需要配置的是USART1还是USART2 usartxbase = (uint32_t)USARTx; 而USARTx是传入这个函数的一个参数。 然后据此来得到用于USART的时钟频率,这个频率值被变量apbclock记录。 从上面变量的跟踪可以看到apbclock的值是0x44aa200即72000000,也就是72MHz。 接下来的一系列计算式就是根据波特率的值来计算应该传入BRR寄存器的值了,偷点懒,这里就不对算式进行一一分析了(我认为暂时没有这个必要)。 至此,USART的设置工作完成,即完成了其数据位、停止位、奇偶校验位、波特率的设置工作。异步通信的配置工作完成。当然,细细分析,可以发现,初始还按默认方式处理了硬件握手等的处理工作。 除了使用库函数提供的printf等函数外,我们在单片机开发中还经常使用直接对数据寄存器赋值的方法来使用串口。STM32串口的数据寄存器名为DR,因此,我试着在main函数中写入这样一行: While1() { USART1-》DR=0x55; } 一试成功,软件仿真时,在串行窗口出现了大串的字符55. 好了,串口暂时告一段落。
- STM32学习笔记:在IAR中建立FWlib 3.0项目(08-13)
- 基于STM32单片机的火控系统信号采集测试(11-14)
- 基于LabVIEW的STM32调试平台设计(11-17)
- 基于STM32的LF RFID识别系统设计(11-25)
- STM32中断与嵌套NVIC快速入门(01-25)
- 基于TLC5947的旋转LED屏显示控制器设计(01-25)