STM32学习笔记——修修改改玩串口
还是原来的风格,找个例子来玩。但是这次的printf这个例子有点不一样,它依赖于ST自己的EV板子,所以要用到的东西多一些了。除了上图所示的文件以外,还要把
这里的stm32_eval.c,stm32_eval.h文件,以及图中所示三个文件夹中任意一个文件夹中的部分文件复制到第一个图所示的文件夹中去,这里我们选择stm3210e_eval这个文件夹。
需要复制的文件是stm3210e_eval.h
如同前面一样建立工程,并且注意修改stm32_eval.h的内容
将//#define USE_STM3210E_EVAL 前的#去掉。
这样,就可以编译并通过文件,用软件仿真,在usart #1窗口显示出
USART Printf Example: retarget the C library printf function to the USART
这样一行字了。
显然,对这样的玩法我是不会满意的,下面试着去掉与stm32e_eval等相关文件,把这里面需要用到的函数直接复制到main中去,同时,也了解一些串口设置的知识。
学到这里,多少有点明白了,STM提供的库为了达到通用性的要求,用了很多的符号来替代常量,然后七转八拐,有时不知要转多少个弯才能找到最终对寄存器操作的代码。这时,keil提供的符号浏览就很有用处了。方法是在将光标移到需要查看的符号上面,按下F12即可,通常可以直接跳转到所需查看到的符号的出处。如下图
将光标移到USART_BaudRate处,按下F12,即跳转到stm32f10x_uart.h文件中相应的定义处:
如果stm32f10x_uart.h文件没有打开,那么这个动作会自动打开这个文件。
下面我们将eval板相关的函数复制到main函数中,以便丢掉与eval板相关的文件。
(1)打开stm32_eval.h文件,将
typedef enum
{
COM1 = 0,
COM2 = 1
} COM_TypeDef;
复制到main.c中,这是用来选择哪一个串口的,因为我的板子上也有2个串口,所以就把它复制过来,也省得对函数作较大的修改了。
(2)打开stm32_eval.c文件,有一个
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)
的函数,是用来初始化端口的,我们把它复制到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文件夹中将这些文件删除,关闭工程,再重新打开工程,编译通过,运行通过。
评论
查看更多