完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
CubeMX 的下载还有安装的避坑上篇文章写了,有兴趣的可以去看,这里就直接用了。
我的平台是STM32F407ZG,其他平台同理,没什么太大区别。好了,正片开始。 这篇主要是UART通信,首先要配置外部晶振,我这里是25Mhz的外部晶振。 这里因为我要用到网络部分,所以就先打开了Master Clock Output,因为网络模块没有使用独立的50MHZ晶振,所以使用STM32的MCO2输出50Mhz来驱动网口正常工作,也可以用MCO1。这里的详细倍频分频选择网口模块的配置再详细说明。不需要MCO输出频率的可以不勾选Master Clock Output。 这里也设置一下SYS,虽然没太理解到底干啥,但是有用,预设一下,别忘记了,这个太容易忘记了,因为这段话是我回过头来补上的。 接下来就是USART1的配置,这里选择Asynchronous异步通信模式,然后打开中断 接下来需要注意一个地方,就是GPIO口设置 在这里一定要检查GPIO是不是和原理图对应的引脚一致,因为在软件设置多个功能之后再来设置UART串口时,可能会去复用其他一些引脚来实现UART功能。我就遇到了这个情况,想当然的以为引脚会自动选择最常见的PA9 PA10。这里一定要检查是不是对应上了。 如果没有对应上,那么就要去手动修改。 一定要是打开了这个异步通信模式之后再去找自己原理图对应的IO口。 这里UART串口的频率我就使用的默认115200 来到时钟树的配置界面,先自动选择一下子 这里是M=25 N=300 P=2,也就是先分频25,然后倍频300,最后再分频2,得到了PLLCLK频率为150Mhz,因为我这个板子需要MCO2输出50Mhz才把PLLCLK拉到了150Mhz,一般情况可以是168Mhz,这个比较常见,也是F407的最大频率,具体怎么算到168Mhz方法同上。 目录一定是纯英文,这样不会出错。然后IDE也别忘了选择Keil软件,还有对应的版本。 第一点是这里可以选择只生成需要用的hal库,可以让生成的代码小一些,不然的话会非常的大。 第二点就是勾选了 c/h 那个,可以让函数分文件,而不是都生成在了main函数里。 代码生成文件的按钮在这个位置,当时我真的是找了半天哈哈哈哈,真的有可能看不到啊。 直接打开工程就可以了,我用的Keil5不知道是版本问题还是什么,打开cubemx生成的文件总要弹出来这个窗口,以及选择驱动,回头我去找一找解决方法,然后更新 这里一步一步的选择就可以了 这里写自己的代码时候可以注意下,写在begin和end之间,这样的话可以在更新cubemx配置后保留自己写的代码。 这里一大堆,就不去一个一个说了,也不去说原理,我也理解的不太好,就说说咋用吧,一个是非中断,一个是中断。 非中断 重新定义printf函数 在 stm32f4xx_hal.c中包含#include 《stdio.h》 在 stm32f4xx_hal.c 中重写fget和fput函数 #include 《stdio.h》 extern UART_HandleTypeDef huart1; //声明串口 /** * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; } /** * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff); return ch; } 在main.c中添加 #include “stdio.h” #define RXBUFFERSIZE 256 char RxBuffer[RXBUFFERSIZE]; while (1) { /* USER CODE END WHILE */ printf(“Hello World!rn”);//经典的Hello World!哈哈哈哈哈 HAL_Delay(1000); /* USER CODE BEGIN 3 */ } 现在开始编译,然后准备下载,在下载之前,还要准备一下,这个经常忘 外部晶振25Mhz,这里匹配上吧,虽然不匹配也都没发现什么问题 这里我用的jlink下载,习惯SW模式了,这里的下载速度默认是20Mhz,尽量改的低一些,因为太高了好像无法开启调试模式。 这时候打开串口调试助手就可以了,记得匹配好波特兰115200 Bingo,成功了哈哈哈(小声嘀咕,为了写总结,我又重新写了一遍,大晚上的蓝色小灯要闪瞎我的眼了) 像这里,单独的接收和发送也都是可以的 HAL_UART_Transmit(&huart1,(uint8_t*)aRxBuffer,10,0xFFFF); HAL_UART_Receive(&huart1,(uint8_t*)aRxBuffer,10,0xFFFF); 中断 因为中断接收函数只能触发一次接收中断,所以我们需要在中断回调函数中再调用一次中断接收函数 具体流程: 1、初始化串口 2、在main中第一次调用接收中断函数 3、进入接收中断,接收完数据 进入中断回调函数 4、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据, 5 回调函数中要调用一次HAL_UART_Receive_IT函数,使得程序可以重新触发接收中断 HAL_UART_Receive_IT(中断接收函数) -》 USART2_IRQHandler(void)(中断服务函数) -》 HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数) -》 UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数) -》 HAL_UART_RxCpltCallback(huart);(中断回调函数) 在main.c中添加下列定义: #include 《string.h》 #define RXBUFFERSIZE 256 //最大接收字节数 char RxBuffer[RXBUFFERSIZE]; //接收数据 uint8_t aRxBuffer; //接收中断缓冲 uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数 在==main()==主函数中,调用一次接收中断函数 |
|
|
|
只有小组成员才能发言,加入小组>>
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
424 浏览 1 评论
278 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
247 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
611 浏览 2 评论
634 浏览 2 评论
1364浏览 9评论
37浏览 3评论
STM32CUBEMX4.22.1在main函数里面添加一行语句就死机的原因?
47浏览 3评论
42浏览 3评论
KEIL MDK为什么无法debug library中的代码?
80浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-27 17:31 , Processed in 0.743559 second(s), Total 73, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号