开发硬件: 原子STM32F429阿波罗底板 + 自制核心板(因为原来原子的坏了...太贵了买不起还是老老实实自己做一个....也许这也是原子开放原理图的初衷吧...23333)
开发环境:Stm32cubemx(Ver: 4.26.1) / Keil5(Ver: 5.23 )
任务概要:1.使用Stm32F429 Usart1 打印信息,并可以反向控制开发板函数进行功能调试。
说明:开发中,调试口不可或缺,Usart1作为Stm32 通用串口用作打印启动信息,调试信息等。除了打印为了更好的调试,这里把原子的开发过的代码也移植进来。
//---------------------------------------------华丽的分割线------------------------------------------------------
Part1:基本配置
1.打开Stm32Cubemx,点击NewProject建立一个Stm32F429的新工程。
2.在Pinout页面进行必要的设置 分别是RCC,SYS(具体看图步骤2配置)
i. RCC:High Speed和Low Speed Clock选项 选择Crystal/Ceramic Resonator
Crystal水晶,Ceramic陶瓷,Resonator谐振器。指的就是外部晶体振荡器.
众所周知,单片机的最小系统:电源电路,晶振电路,复位电路。画板的时候
提供的是25Mhz的晶振,和36.768khz的晶振。
ii.SYS: Debug选项设置成serial wire 串行线我们要用SWD下载,
Timebase source设置成TIM7。
3.配置系统时钟,切换到Pinout旁边的Clock configuration时钟配置。(步骤3配置)
i.输入时钟源Stm32标注了4-26Mhz,我们这里输入25Mhz。
ii.然后我们看一下他的输入一直到SysClk的公式:
Input frequency输入频率 / M * N / P = SysClk
∵ 有以下条件
※ 输入频率/M的值必须≥0.95Mhz且小于等于2.1Mhz
※我们的SysClk的值为180Mhz(Stm32F429最大的正常工作频率,非超频)
∴ 综合以上条件,我们进行如下配置:
Input frequency输入频率(25Mhz) / 25 * 360 / 2 = 180
这样配置 25Mhz / 5 就得到1Mhz符合条件1不大于2.1 不小于0.95.而且得到1对后面的配置就变得简单。
iii. APB1 Prescaler(预分频器)的值设为/4 因为后面PCLK1的值最大45Mhz(180/4=45)
APB2 Prescaler的值设为/2,PCLK2最大90Mhz。
这样我们就完成了一个工程的基本要素配置,PS:Cubemx方便而且统一了大家的工程
//---------------------------------------------华丽的分割线------------------------------------------------------
Part2:生成工程
1.点击最上方菜单栏Project选项->Generate code 生成代码,随即会弹出Project Setting对话框(这个只会在第一次弹出)
以后要设置这个的话Project选项->Setting 设置,就可以重新见到这个页面了。
i.首先是Project Name你的工程名:我们这里起Template(模板)
ii.然后是你的Project location 工程目录地址(即你想把你的工程放在哪个目录下,自行设置了,建议不要有中文名字)
iii. 看到Tool chain / IDE选项开发环境选择MDK - ARM V5,即Keil 5.
iv.ok,然后看最上面的页面选择有Project工程,Code Generate代码生成 , Advanced Setting高级设置
这里选择Code generate.会看到有三组选项:
①第一组STM32Cube Firmware library package 固件库包,可以默认第一个复制所有的库
(不过那样会导致如果你开了按F12可以检索函数的配置你会编译很慢文件也大)。
这里我们选择第三个 Add necessary library files as reference in the toolchain ······· 添加所需要用到的库文件(非所有)
②第二组的第一个勾选上,Generate peripheral initialization as pair of‘.c/.h’files per peripheral
每个外设生成一对'c / .h'文件的外设初始化
v.Ok,然后电机确认就可以生成工程了。生成完后,有个对话框提示,我们点击Open Project即可。
然后这里提及一个小Bug,工程建立后,还需要进行一个优化配置就是,我们经常会用到STLINK,但是这个工程下载下去并没有跑起来这是为什么呢,在设置 Debug->ST-link setting 的Download Fuction里面 我们会发现 它生成的工程没有勾选 Reset and Run。所以STLINK 下载后没反应,要关闭电源再开才跑。这里勾选一下,然后关闭工程再打开就可以了,一个小细节的问题.详细如图哈。
//---------------------------------------------华丽的分割线------------------------------------------------------
Part3:Usart1 功能使用
1.首先在Cubemx里面,Pinout页面,我们可以从列表中看到STM32F429强大的功能列表。我们打开Usart1->mode选项
选择Asynchronous异步选项即可。随即看到PA9和PA10被高亮。
2.在Cubemx里面,Configuration页面,我们看到Connectivity(连接)功能中多了一个Usart1,点击它。
可以看到一个基本设置 Baud rate 波特率 115200bits/s 一秒传输115200个位数据信息。一个停止位,没有校验位。
我们点击到Nvic settings(中断管理)中,因为你永远不知道对方什么时候发信息给你,这是不确定的你要用中断去进行接收。
扩展一下基本知识就是:串口协议是这么规定的:起始位 +数据(8位) +停止位(这里没有校验位)。
所以我们传输一个字节数据要用到10个位。这样算下来 115200/10 = 11520 字节/s。(即速度为11520 B/s)
通俗一点的说的话,KB是1024个B,11520 (B/S) / 1024 = 11.25KB/S就是我们这个功能所拥有的速度了。
这个是为了让你知道它的速度局限在哪里。因此来做一些它所力所能及的事情。当然如果数据量大,必要的话我们还会开启DMA选项。
以后再做论述。
3.生成代码,点菜单栏Project选项 和原来一样点生成代码,生成后,不用再点Open project,关闭对话框,你点原来的还在打开的工程,就会出现Reload选项(重新加载),点Reload就可以了。这样你原来的代码就可以更新了。Reload之后我们就可以在application/user中发现多了一个usart.c的文件了。ok,功能加载成功。
4.功能实现:发送,发送是最简单的了,因为他由你决定什么时候发送,你只需要把你的数据送到功能寄存器,然后给它一个指令就由硬件biu的发送出去了.....(这也是为什么我们花钱的买它原因吧....毕竟方便就像电器使用一样.)
那么说明书在哪里呢,我们点进工程的Driver/STM32F4xx_HAL_Driver目录,找到stm32f4xx_hal_uart.c
ok,这里有一个大标题 ##### How to use this driver #####,下面一段**详细的叙述了如何去使用这个驱动器(东西多我就不贴出来了。我当时就看了这个发现他其实说的挺好的了。包括步骤,函数介绍啥的。这里我当做各位英语水平都是ok的哈,不ok,google翻译,问人,百度。怎么都行,路总有的。)
拖出来人家写好的:
// 串口的发送接收函数:
// HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
// HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。
// HAL_UART_Transmit_IT();串口中断模式发送,
// HAL_UART_Receive_IT();串口中断模式发送
// HAL_UART_Transmit_DMA();串口DMA模式发送
// HAL_UART_Receive_DMA();串口DMA模式发送
// 串口相关的中断函数:
// HAL_UART_TxHalfCpltCallback():一半数据(half transfer)发送完成后,通过中断处理函数调用。
// HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。
// HAL_UART_RxHalfCpltCallback():一半数据(half transfer)接收完成后,通过中断处理函数调用。
// HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。
// HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。
好,直接在主循环里面调用
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
如图:
发送直接有了。(ˉ▽ ̄~) 切~~
5.功能实现:接收 。 关于中断接收,根据说明The specific UART interrupts (Transmission complete interrupt, RXNE interrupt and Error Interrupts) will be managed using the macros __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit and receive process.
i. ※我们要先使用 __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);对串口Usart1 的接收中断进行使能。
ii.然后中断的处理在 stm32f4xx_it.c 函数。进行接收和处理。
烧写测试,ok。没问题。 收发都正常了。开始进行原子的Usart功能移植。
//---------------------------------------------华丽的分割线------------------------------------------------------
Cubemx的命名都比较的规范,原子移植的话要改动的地方还是挺多的。
活用文本处理 将 u8 u32等批量修改成uin8_t 等符合STM32Cubemx的规则。
同时我还写了一个重定向和bootinfo来打印开机信息(软件版本 硬件版本)以及芯片序列号
花了差不多20分钟移植。。。如果你要用的话 非常方便
1. 建立一个工程
2.Cube中打开Usart1功能(异步,打开Nvic中断两个步骤)
3.把代码中的Usmart文件夹移过去。
4.Include头文件路径 添加.C文件
5.然后在Main.c加 usmart_dev.init(90); 初始化
6.在stm32f4xx_it.c中的Usart1_Handler函数添加Usmart_Rev_Pro();即可
可以看到开机打印信息,以及灯函数翻转测试. 整个工程从零开始,完成耗费时间4小时。希望能帮到大家哈。 |