STM32中级教程:探索内部温度传感器

5星 · 超过95%的资源 需积分: 31 3 下载量 113 浏览量 更新于2024-09-10 1 收藏 737KB PDF 举报
"零死角玩转stm32-中级篇-Temperate(芯片温度).pdf,免费下载,涉及STM32中级知识,包括芯片温度测量的实验和ADC使用" 这篇内容是关于STM32微控制器的中级教程,重点介绍了如何通过串口1 (USART1) 实时监测并打印STM32F103VET6芯片的内部温度。教程分为初级、中级、高级和系统篇,旨在帮助初学者逐步掌握STM32的使用,从基础到深入,涵盖裸机编程到系统级应用。 在实验部分,主要利用了串口通信和ADC(模数转换器)功能。硬件连接中,温度传感器内置在芯片内部,与ADC的一个输入通道——ADCx_IN16相连。所需的库文件包括启动文件、CMSIS核心文件、系统文件以及STM32F10X系列的GPIO、RCC、USART、ADC和DMA等库。此外,还涉及到用户自编写的main.c、stm32f10x_it.c、usart1.c和adc.c等文件,用于实现温度读取和串口通信。 STM32F103VET6芯片内集成了3个12位ADC,每个ADC有21个外部通道,可进行单次、连续、扫描或间断模式的转换。在实验中,使用的是内部的ADCx_IN16通道,它连接到温度传感器,而ADCx_IN17则连接到内部参考电压。ADC的转换结果可以左对齐或右对齐的方式存储在16位数据寄存器中。此外,芯片还具备模拟看门狗功能,可以监控输入电压是否超出预设范围。 实验的具体步骤未在摘要中详述,但可以推测,它应该包括配置ADC、设置转换序列、启动转换、读取结果并通过USART1发送到计算机的超级终端。这个过程不仅帮助开发者理解STM32的温度测量,也提供了使用ADC和串口通信的实际操作经验。 STM32库开发实战指南也被提及,这是一本即将出版的书籍,将提供更适应纸质阅读的排版和丰富的参考资料,是学习STM32开发的必备工具书,预计会给读者带来更多惊喜。 这份中级篇教程涵盖了STM32的ADC操作和温度测量,是提升STM32编程技能的重要学习材料。通过实践这样的实验,开发者能够更好地理解和应用STM32的多种功能,为进一步的系统级开发打下坚实的基础。

请修改代码,让它实现(1)按下KEY0键,一次采集 ADC 测量的电压值显示在LCD上;(2)按下KEY1键,采集5次ADC 测量的电压值,求平均显示在 LCD 上。int main(void) { u16 adcx; // ADC??? float temp; // ??? float temperate; // ??? u8 times; // ??????? // ??? delay_init(); uart_init(9600); LED_Init(); LCD_Init(); T_Adc_Init(); // ??????? POINT_COLOR=RED; LCD_ShowString(60,50,200,16,16,"Mini STM32"); LCD_ShowString(60,70,200,16,16,"Temperature TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2014/3/9"); POINT_COLOR=BLUE; LCD_ShowString(60,130,200,16,16,"TEMP_VAL:"); LCD_ShowString(60,150,200,16,16,"TEMP_VOL:0.000V"); LCD_ShowString(60,170,200,16,16,"TEMPERATE:00.00C"); while(1) { // ???? if(KEY_Scan(0) == KEY0_PRES) { // ??KEY0? adcx = T_Get_Adc(ADC_CH_TEMP); // ??ADC? temp = (float)adcx * (3.3/4096); // ????? LCD_ShowxNum(132,130,adcx,4,16,0); // ??ADC? LCD_ShowxNum(132,150,temp,1,16,0); // ????? temperate = (1.43 - temp) / 0.0043 + 25; // ????? LCD_ShowxNum(140,170,(u8)temperate,2,16,0); // ????? temperate -= (u8)temperate; // ?????? LCD_ShowxNum(164,170,temperate*100,2,16,0X80); // ????? } else if(KEY_Scan(0) == KEY1_PRES) { // ??KEY1? times = 5; // ??5? adcx = 0; // ADC??? while(times--) { adcx += T_Get_Adc(ADC_CH_TEMP); // ??ADC? delay_ms(10); // ??10ms } temp = (float)adcx / 5 * (3.3/4096); // ??????? LCD_ShowxNum(132,150,temp,1,16,0); // ??????? temperate = (1.43 - temp) / 0.0043 + 25; // ??????? LCD_ShowxNum(140,170,(u8)temperate,2,16,0); // ????? temperate -= (u8)temperate; // ?????? LCD_ShowxNum(164,170,temperate*100,2,16,0X80); // ????? } LED0=!LED0; // LED?? delay_ms(250); // ??250ms } }

2023-06-03 上传