上学期的嵌入式系统课程实验报告,参考老师给的实验指导书自己写的实验报告,比较详细,分享一下~
硬件:ST Nucleo Board开发板,Mini USB数据线
软件:实验通过软件STM32CubeMX进行引脚配置,并生成代码,代码使用的是HAL库,可在集成编译环境Keil中进行代码修改与添加。
文档:开发板的原理图、STM32F4xx参考手册和 HAL 驱动说明书
ST Nucleo Board开发板具有通用同步异步收发器(USART),使用异步通信需两个引脚Rx、Tx,分别进行数据接收与输出。其具有HAL 库轮询,中断, DMA 三种编程模型,在本实验中采用中断模型。
温度(℃)= [(VSENSE – V25)/Avg_Slope)] + 25
其中VSENSE 为传感器输出电压值,V25为25℃时的VSENSE 的值,Avg_Slope为温度与VSENSE曲线的平均斜率。根据数据手册的电气特性(如下图所示)可得V25=0.76V=760mV, Avg_Slope = 2.5Mv/℃。
1)配置引脚
查看Nucleo Board 电路图,如下图红框所示,找到对应虚拟串口所对应的 UART引脚为PA2,PA3,并进行配置(RX 接收、 TX 发送)。 串口模式选择 Asynchronous 异步通信方式。ADC1外设选择温度传感器通道。
(图3. STM32CubeMX 工程引脚配置图(其中除PA2,PA3的其它引脚为其它实验功能需求))
2) 配置引脚参数
ADC1选择默认配置,USART设置波特率为 115200 Bits/s。传输数据长度为 8 Bit。奇偶检验无,停止位1.其他参数默认。并在NVIC设置中选择中断使能。
3)生成项目代码
1) 首先定义发送接收数组与ADC采集的电压值AD_Value与温度变量Temp
uint16_t AD_Value = 0;
float Temp = 0;
2) 在主函数的while循环中打开串口接收,判断接收到的数据为11时,进行温度测量并发送测得的温度。
3 ) 其中printf函数为重新定义标准库函数实现串口输出的。方法是将fputc 里面的输出指向串口(重定向),即需要自己添加一个 int fputc(int ch, FILE *f)函数。具体做法为:在 main()函数前面添加如下代码,
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
代码中添加了#ifdef 宏定义进行条件编译,如果使用 GUN C 编译,则 PUTCHAR_PROTOTYPE 定义为:int __io_putchar(int ch)函数,否则定义为 int fputc(int ch, FILE *f)函数。再定义 printf()函数
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
在电脑上打开串口助手,选择对应串口号,设置波特率为115200,按下复位键,。通过窗口助手发送11,则串口助手回复测得的当前MCU温度,如上图所示。
通过该实验,熟悉了STM32的开发流程,也了解到使用单片机做实验的基本思路是一致的。即首先要阅读数据手册,了解其具有的功能特性与不同功能模式的相关寄存器配置;然后根据具体型号芯片的电路图进行引脚配置。
使用STM32CubeMX软件开发为实验提供了很多便利,即配置引脚、参数等都可以在这个软件完成而不需自己用代码写,提高了开发效率,不过对其生成的代码也要看懂,一方面可以学习代码编写,一方面如果对其中的某一配置有需要修改的可以直接在编译器中对代码进行修改,节省时间。
当使用到某一个功能的时候,需要对该功能对应的HAL库函数进行阅读和学习,因为库函数提供了大量的封装好的功能函数,可以很方便地实现实验所需功能,而不需要自己去对寄存器进行读写操作。但是有时候对一些没有封装的底层宏定义函数也可多了解,这样可以更灵活地使用。