电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记

发布时间:2026/5/25 3:57:10

电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记 文章目录前言一、基础入门1.GPIOGPIO的引脚速度GPIO的翻转速度引脚功能端口复用和端口重映射输入输出模式引脚设置2.新建工程F103G4313.必备宏定义F1034.注意库函数F1035.时钟系统及滴答定时器6.中断7.其他编程注意事项二、开发学习标准库版本1.LEDLED与LCD冲突解决方法2.蜂鸣器3.独立按键4.LCDLCD字符高亮颜色显示5.TIMER6.实时时钟7.USART8.24C029.ADC10.PWM TIM_OC11.TIM_IC12.DMA13.数码管14.ADC按键15.DS18B2016.光敏电阻17.ADCx2双通道18.DTH1119.TLC551测量20.LIS302DL蓝桥杯嵌入式旧板资料包免费下载蓝桥杯嵌入式旧板程序代码免费下载************************************************HAL库版本定时器串口输入捕获ADCRTC前言蓝桥杯嵌入式的学习总结本文主要针对蓝桥杯嵌入式作出总结STM32F103RBT6型号标准库版本STM32G431RBT6型号HAL库版本进行讲解由于第一年已用标准库参赛第二年HAL库版仅为学习链接可在文章旧版讲解的基础上对新版进行学习。如果读者时间充足建议先学好模电数电基础知识同时用开发板实际操作能让学习事半功倍且能学习更深入。一、基础入门1.GPIO首先GPIO最基本、最简单的作用是我们可以通过编程的方式让它作输入或者输出而输入/输出的形式为高低电平通常0V为低电平3.3V为高电平。 要让GPIO作输入或者输出首先就需要对IO口相关的寄存器进行配置。而寄存器是中央处理器内的组成部分寄存器是有限存贮容量的高速存贮部件它们可用来暂存指令、数据和地址。因此对IO口的初始化就是向相关寄存器里面写不同的值从而确定使用哪一个IO口IO口标号、以及IO口工作模式输入还是输出、输出速度等参数。在经过初始化之后就可以正常使用IO口了比如如果IO口设置成了某个输入模式就可以通过调用相关函数或者直接操作相关寄存器去得到IO口的电平是高电平还是低电平。—单片机引脚与端口引脚和GPIO的区别GPIO的引脚速度输出驱动电路的响应速度芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路用户可以根据自己的需要选择合适的驱动电路通过选择速度来选择不同的输出驱动模块达到最佳的噪声控制和降低功耗的目的。可理解为: 输出驱动电路的带宽即一个驱动电路可以不失真地通过信号的最大频率。如果一个信号的频率超过了驱动电路的响应速度就有可能信号失真。GPIO的引脚速度跟应用相匹配速度配置越高噪声越大功耗越大。GPIO的引脚速度跟应用匹配推荐10倍以上。①USART串口若最大波特率只需115.2k那用2M的速度就够了既省电也噪声小。②I2C接口若使用400k波特率若想把余量留大些可以选用10M的GPIO引脚速度。③SPI接口若使用18M或9M波特率需要选用50M的GPIO的引脚速度。GPIO的翻转速度GPIO的翻转速度指输入/输出寄存器的01值反映到外部引脚(APB2上)高低电平的速度。手册上指出GPIO最大翻转速度可达18MHz。通过简单的程序测试用示波器观察到的翻转时间: 是综合的时间包括取指令的时间、指令执行的时间、指令执行后信号传递到寄存器的时间(这其中可能经过很多环节比如AHB、APB、总线仲裁等)最后才是信号从寄存器传输到引脚所经历的时间。引脚功能端口复用和端口重映射复用就是当这个GPIO作为片内外设功能引脚一个引脚可用作实现多个功能原理图上的引脚注释为可复用功能或芯片数据手册可查1.做普通IO输入输出2.其他外设的输入输出好处是节省外设与GPIO所用引脚数量STM32有很多的内置外设这些外设的外部引脚都是与GPIO复用的。重映射就是将所需的片内外设的复用功能从原本默认IO口重新定义到其他可实现该功能的引脚芯片内部已经固定了只能映射到固定的地方分部分重映射端口有一个默认复用功能和多个可重映射功能和完全重映射端口有一个或多个默认复用功能和一个可重映射功能stm32中文手册可查通过配置该复用功能重映射哪个端口好处是防止该复用功能默认引脚被占用多个功能所需引脚冲突复用功能I/OAFIO在使用引脚的单个复用功能时无需打开AFIO时钟只需使能该复用功能的时钟和需要的输入输出模式复用功能重映射时需使能AFIO时钟。—端口复用和端口重映射—片上外设和片外外设的区别—什么时候需要复用IOAFIO输入输出模式驱动能力就是指输出电流的能力。对于驱动大负载即负载内阻越小负载越大时例如IO输出为5V驱动的负载内阻为10ohm于是根据欧姆定律可以正常情况下负载上的电流为0.5A推算出功率为2.5W。显然一般的IO不可能有这么大的驱动能力也就是没有办法输出这么大的电流。于是造成的结果就是输出电压会被拉下来达不到标称的5V。当然如果只是数字信号的传递下一级的输入阻抗理论上最好是高阻也就是只需要传电压基本没有电流也就没有功率于是就不需要很大的驱动能力。FT容忍5V输入浮空输入GPIO_Mode_IN_FLOATING电平会完全取决于外部电路而与内部电路无关无外部电路接入时IO脚浮空会使得电平不确定由输入数据寄存器(只读)读取。上拉输入(GPIO_Mode_IPU)无外部电路接入时IO脚上拉使电平始终为高电平读取外部电路低电平明显无法判断高电平的输入由输入数据寄存器(只读)读取。下拉输入(GPIO_Mode_IPD)无外部电路接入时IO脚上拉使电平始终为低电平读取外部电路高电平明显无法判断低电平的输入由输入数据寄存器(只读)读取。模拟输入(GPIO_Mode_AIN)不经过施密特触发器将外部信号直接传输到数模转换通道上片上外设(ADC)直接读取IO脚输入。推挽输出(GPIO_Mode_Out_PP)上PMOS下NMOS降低功耗带载能力强跳变速度快但无法完成“线与”功能由输出数据寄存器(可读可写)读取位寄存器后输出给IO脚。复用推挽输出(GPIO_Mode_AF_PP)片上外设功能的推挽输出。开漏输出(GPIO_Mode_Out_OD)可以根据外部电路需要多少V的高电平来接入外部上拉电压实现线与的功能IIC一个低电平可以拉低整个总线。复用开漏输出(GPIO_Mode_AF_OD)片上外设功能的开漏输出GPIOx_IDR是端口的输入数据寄存器GPIOx_ODR是端口的输出寄存器—深刻理解stm32输入输出模式—施密特触发器详解引脚设置寄存器赋值输入可以使用“|”操作但读取和定时器通道只能单个位进行操作。—位带操作—寄存器编程2.新建工程F103G431赛点资源数据包 - 8-液晶驱动参考例程 - 复制CT117E-LCD文件夹 - 粘贴考生文件夹好处大大节省建立工程的时间不用专门考虑工程格式不用担心建立工程时的小细节浪费比赛时间方便练习。工程文件改名粘贴后清空子文件夹Output内全部内容 - 子文件夹Project内除后缀《.uvproj工程和.uvopt文件》其他文件全部删除 - 剩下两个文件分别命名后进入工程为.axf 文件改名。.uvproj工程文件为工程开辟空间是工程核心.uvopt文件为工程保存工程配置关联各文件内容缺少.uvopt文件MDK缺失结构体变量提示功能非工程链接uvopt和uvproj都是keil工程文件共同说明这你工程里有哪些文件文件有没有被编译过工程目录树是怎么组织的等等信息.axf 文件改名工程中Options for Target魔术棒- Output - Name of Executable - 指定文件命名后编译 - 考生文件夹Output子文件夹 - 找到.axf后打包提交注该方法只适用于蓝桥杯嵌入式旧版比赛3.必备宏定义F103工程中Configure target options - C/C - Define选项STM32F10x_MD宏定义作用为使system_stm32f10x.c文件执行设置默认系统时钟72MHz。startup_stm32f10x_cl.s启动文件 → SystemInit() → SetSysClock () → SetSysClockTo72()其中所有函数在system_stm32f10x.c文件。工程中Configure target options - C/C - Define选项USE_STDPERIPH_DRIVER宏定义作用为使stm32f10x.h文件执行包含所有外设头文件。stm32f10x.h通用头文件 → #include “stm32f10x_conf.h” → 包含所有外设头文件。—#预编译详解4.注意库函数F103voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalState NewState);/*外设时钟使能*/voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalState NewState);/*复位所有IO口*/voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);/*对GPIOx_ODR写入系列IO设置*/voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/*对GPIOx_BSRR写入单位置1*/voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);/*对GPIOx_BRR写入单位置0*/voidTIM_OCxPreloadConfig(TIM_TypeDef*TIMx,uint16_tTIM_OCPreload);/*输出比较模式更改比较值后在下次更新事件生效或立即生效*/voidTIM_OCxPolarityConfig(TIM_TypeDef*TIMx,uint16_tTIM_OCPolarity);/*设置输入捕获极性,上升沿或下降沿*//*TIM_OCxPolarityConfig()函数用作输入捕获极性配置时(keil不可跳转到该宏定义)uint16_t TIM_OCPolarity参数可取以下值*/#defineTIM_ICPolarity_Rising((uint16_t)0x0000)#defineTIM_ICPolarity_Falling((uint16_t)0x0002)/*TIM_OCxPolarityConfig()函数用作输出极性配置时(默认)uint16_t TIM_OCPolarity参数可取以下值*/#defineTIM_OCPolarity_High((uint16_t)0x0000)#defineTIM_OCPolarity_Low((uint16_t)0x0002)5.时钟系统及滴答定时器/** *1Mhz的频率每秒钟可以执行1.25M指令。嵌入式stm32默认上电系统时钟8M每个指令的执行周期为1s/8*1.25M0.1us */—stm32的指令周期—时钟系统uint32_t SysTick_Config(uint32_t ticks)函数在core_cm3.h头文件定义void SysTick_Handler(void)中断函数在stm32f10x it.c源文件定义。—SysTick(滴答定时器)6.中断—stm32中断优先级的使用及注意事项7.其他编程注意事项1、判断语句条件中优先级大于、|、^、、||加减乘除优先级大于移位运算2、整型常量数值默认设置为int类型char和short类型与整型常量运算过程中以int类型为范围常数后加“.”或“.0”表示该常数为double型。unsigned int类型0 ~ (2^32 - 1 — 4294967295)—数值范围注意事项float类型小数点后有效数字6~7位double类型小数点后有效数字15~16位3、浮点数注意事项常数后缀UunsignedLlong / doubleFfloatfloat数据类型赋值运算时常数后需加F4、—计算机负数计算5、—keil中code和const的区别6、—主机字节序7、—STM32堆栈区8、—字节和字长区别9、程序中数组绝对不能溢出10、函数中的局部变量存储在栈中栈空间大小1~2KB一个函数包括main函数一次性不能设置太大的数组大数组设置为全局变量静态存储区。10、—寄存器锁存器触发器存储器的区别11、—浅论各种调试接口12、—C语言中的volatile关键字二、开发学习标准库版本1.LED上电默认输出低电平与锁存器相连使能端PD2高电平有效引脚为PC8~15APB2总线控制时钟推挽输出控制亮灭。锁存器的作用蓝桥杯嵌入式中至与LED功能相连锁存器(Latch)是一种对 脉冲电平敏感的 存储单元 电路它们可以在特定输入脉冲电平作用下改变状态。锁存就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存其次完成高速的控制器与慢速的外设的不同步问题再其次是解决驱动的问题最后是解决一个 I/O 口既能输出也能输入的问题。锁存器是利用电平控制数据的输入它包括不带使能控制的锁存器和带使能控制的锁存器。控制LED亮灭先配置相应I/O口再使能锁存器写入状态后关闭锁存器缓存本次状态。/** *初始化LEDLED全灭 *LED1~8 GPIOC8~15低电平亮高电平灭 *74HC573锁存器使能端 GPIOD2高电平使能 */LED与LCD冲突解决方法1、编写LED程序无法保留其他LED状态点亮函数点亮前关闭所有。LED初始化不能先于LCD初始化2、更改LCD程序最优方案三个函数添加这三句代码即可。—LED的配置详解2.蜂鸣器蜂鸣器与JTAG接口的复位脚共用PB4但默认为JTAG接口的复位脚内部上拉上电输出高电平APB2总线控制时钟推挽输出控制开关非比赛考点。/** *初始化蜂鸣器关闭蜂鸣器默认上电为JTRST功能蜂鸣器关闭 *Buzzer GPIOB4低电平打开高电平关闭 *使能端口复用功能禁止JTRST功能 */3.独立按键APB2总线控制时钟上拉输入读取。uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读取端口输入电平状态高电平返回1低电平返回0。三行代码扫描函数或状态机扫描函数必须和定时器配合定时器每10ms执行按键扫描。标志位可放于SysTick_Handler()定时按键处理必须紧跟按键扫描即在同一时间段执行一次。按键操作按下、松开、复合、长按、双击。程序中同时有长按与短按判断时短按使用上升沿触发。/** *初始化KEYKEY设置上拉输入输入速率无需配置默认复位状态速率10MHz *KEY1GPIOA0 KEY2GPIOA8 KEY3GPIOB1 KEY4GPIOB2 *扫描KEY按下端口读取低电平松开端口读取高电平 *//** *扫描KEY按下端口读取低电平松开端口读取高电平 *KEY10x01 KEY20x02 KEY30x04 KEY40x08 *g_rising判断单双击g_key_state判断长短按与单双键 */4.LCD资料包提供例程变量通过sprintf函数整理后通过显示函数展示在LCD需包含stdio.h头文件。2.4寸显示屏单行显示最大值为20英文字符sprintf函数(结尾自动加\0)调用数组大小不能超过20格式化字符串不大于20个英文字符包括空格和字符串结尾的结束符sizeof 计算的是变量的大小而 strlen 计算的是字符串的长度前者不受字符 \0 影响后者以 \0 作为长度判定依据。—利用 strlen 和 sizeof 求取字符串长度注意事项LCD显示中sprintf((char*)string, “%s”);%s格式符的最大长度为19其他格式符时最大长度为20。sprintf函数使用%02d:%02d:%02d可用于在数值前显示02表示%d占2位02表示%d占两位且数值不足两位时前面添0补足数值长度大于数字则该用法无效。在官方给的参考资料里面介绍了分辨率是240x320lcd一共分为10行20列所以一个字符的高实际上是24*16所以我们可以看到lcd.h宏定义里面每一行之间的差值就是24那么每一列之间的差值就是16实际上表示一列的时候是反着来的320表示第一列320-16表示第二列那么320-(16 * i)表示第i列。—点阵图、矢量图、像素图、位图图像、位元块传输—sprintf()函数的用法LCD字符高亮颜色显示void LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);数字显示LCD_DisplayChar(Linex, 320 - (16 *y), variable / 10 48);LCD_DisplayChar(Linex, 320 - (16 *y 1), variable % 10 48);Ascii码数字0-9 — 码值48-57大写字母A-Z — 码值65-90小写字母a-z — 码值97-122voidSTM3210B_LCD_Init(void);/*LCD初始化*/voidLCD_SetTextColor(vu16 Color);/*LCD文本颜色*/voidLCD_SetBackColor(vu16 Color);/*LCD文本区域背景颜色*/voidLCD_ClearLine(u8 Line);/*清屏指定行*/voidLCD_Clear(u16 Color);/*指定颜色清屏*/voidLCD_SetCursor(u8 Xpos,u16 Ypos);/*锁定显示起点坐标*/voidLCD_DrawChar(u8 Xpos,u16 Ypos,uc16*c);/*画字符*/voidLCD_DisplayChar(u8 Line,u16 Column,u8 Ascii);/*LCD展示字符*/voidLCD_DisplayStringLine(u8 Line,u8*ptr);/*指定行展示字符串*/voidLCD_SetDisplayWindow(u8 Xpos,u16 Ypos,u8 Height,u16 Width);/*设置显示区域大小*/voidLCD_WindowModeDisable(void);/*退出窗口模式全屏*/voidLCD_DrawLine(u8 Xpos,u16 Ypos,u16 Length,u8 Direction);/*画线*/voidLCD_DrawRect(u8 Xpos,u16 Ypos,u8 Height,u16 Width);/*画矩形框*/voidLCD_DrawCircle(u8 Xpos,u16 Ypos,u16 Radius);/*画圆*/voidLCD_DrawMonoPict(uc32*Pict);/*画单色图片*/voidLCD_WriteBMP(u32 BmpAddress);/*显示BMP位图*/voidLCD_DrawBMP(u32 BmpAddress);/*画BMP位图*/voidLCD_DrawPicture(constu8*picture);/*画图片*/5.TIMER分频寄存器(PSC)数值为0表示1分频设置PSC寄存器值需要的分频数-1计数器达到自动重装载值后再加1则产生溢出自动重装载寄存器(ARR)中再次写入自动重装载值设置自动重装载寄存器(ARR)数值需要的计数值-1。通用定时器定时器2~5各4通道高级定时器定时器1和8各4通道基本定时器定时器6和7直接连接驱动DAC没有引脚复用TIM_RepetitionCounter对高级定时器有用定时器在发生中断源事件时进入中断服务函数更新中断溢出TIM_IT_Update、捕获/比较事件CNT CCRxTIM_IT_CCx等事件产生使TIMx_EGR寄存器置位只有更新事件UEV发生更新中断或TIMX_EGR寄存器的UG位置位触发定时器计数初始化所有寄存器被更新预装载寄存器只有发生更新事件才将数据更新至影子寄存器真正的装载寄存器。设置中断源void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);/** *定时器2初始化 *预分频系数计数时钟频率 f / (PSC 1)PSC - 1 自动重装值(计数溢出重回0后产生中断)ARR - 1向上计数法时钟1分频 定时器中断配置并使能 *中断优先级分组中断通道选择并使能中断等级设置 *默认复位APB1时钟36MHz2分频通用定时器时钟72MHzAPB1预分频系数不等于1 *//** *定时器2中断 *定时器溢出定时器中断标志位置1需软件手动清0 */—stm32定时器中断类型—STM32定时器中的更新操作与更新事件—STM32中断服务函数的编写注意事项1—STM32中断服务函数的编写注意事项2—stm32定时器误区6.实时时钟蓝桥杯嵌入式开发板的RTC只能使用LSI即内置RC振荡器。实时时钟可不用开启中断使用。RTC不在APB1和APB2时钟总线上需单独配置时钟使能LSI时钟40KHz4000分频系数3999得计数频率1s。RTC时间存储以定时器计数总值存储每计数加一为时间1s60s 1min3600s 1h0x0001517F为23:59:590x00015180为00:00:00void RTC_SetCounter(uint32_t CounterValue)设置初始时间(单位秒)hour * 3600 minute * 60 secondRTC中断服务函数为RTC_IRQHandler()不是RTCAlarm_IRQHandler()/** *RTC初始化 *配置RTC中断开启触发每秒中断 *备份寄存器(BKP)与电源管理(PWR)时钟使能使能BKP复位BKP寄存器 *使能LSI时钟等待LSI使能完毕配置LSI为RTC时钟源RTC时钟使能 *等待APB1和RTC时钟同步等待对RTC操作完成设置RTC频率等待完成设置计数值初始时间等待完成 *//*实时时钟获取计算多少个3600秒时、除去多少个3600秒后余多少个60秒分、除去多少个60秒后余多少个秒秒*//*每秒触发中断判断是否计数达到23时59分59秒*/—stm32之备份寄存器(BKP)应用侵入检测中断—STM32电源管理(PWR)7.USART数据发送使用字符串发送函数或者重定义fput函数然后使用printf只要程序中有printf重映射函数必须勾选Use MicroLIB选项否则程序无法运行。用串口调试助手给单片机以字符串的形式发送数据时结尾是不默认添加’\0’。半主机模式就是通过仿真器实现开发板在电脑上的输入和输出单片机程序运行应脱离仿真器关闭半主机模式。数据接收开启串口接收中断USART_FLAG_TC和USART_FLAG_TXE区别TC和TXE在复位默认置1但TXE在对发送寄存器(USART_DR)写操作后被清零TC要先读状态并对寄存器写操作才进行清零两者都可软件清零所以上电后使用TC来判断字符串传输时如果未清零(软件清零或软件序列清零)会导致首字母被覆盖而不显示而TXE在首字母转移到发送寄存器后立即清零不会被覆盖。除了复位首字母问题程序运行过程中会被自动被特性规则清零不必手动清零。/*添加该内容不必勾选Use MicroLIB选项*/#pragmaimport(__use_no_semihosting)struct__FILE{inthandle;};FILE __stdout;_sys_exit(intx){xx;}/***********************************//** *初始化USART2IO口配置(APB2总线时钟)串口配置(APB1总线时钟)中断配置 *发送端TX2 PA2复用推挽输出50MHz接收端RX2 PA3浮空输入 *波特率f_baudrate 字节长度8bit 停止位1位 校验位无 模式接收和发送 硬件数据流控制无 *中断通道串口2中断 最高抢占和响应优先级 *//** *发送字符串 *发送标志位使能发送字符数据返回字符 *USART_FLAG_TC表示传输完毕USART_FLAG_TXE表示发送缓冲区空无特殊情况均使用USART_FLAG_TXE效率快 *注意while和if后的括号中无论是it还是i都先执行括号内的自增减再执行大括号内的语句 *//*重定义fputc函数printf函数调用*//** *串口2接收中断服务函数 *注意接收字符串结尾必须加换行符(\r\n) */—对原子哥USART实验中printf重定向进行分析—USART与UART的区别—串口接受不定长数据方法—printf重映射解释—printf函数重定义—printf输出串口助手、防卡死办法—上电发送字符串首字母问题8.24C02写数据的时候需要注意E2PROM是先写到缓冲区发送完Stop然后再“搬运到”到掉电非易失区进入写入周期这个过程让它应答是没有响应时间需要最大10ms不用芯片时间不同开发板上M24C02时间为5ms直到写入周期完成。AT24C02是Ateml公司的2KB的电可擦除存储芯片M24C02是ST公司的2KB的电可擦除存储芯片区别在于AT24C02支持8字节页写、M24C02支持16字节页写页写入一次性连续写入最多8字节24C02一页为8字节起始地址为0x00注意超过页边界会自动从头覆盖到缓冲区后再等待一个写入周期多字节“搬运到”到掉电非易失区连续写和连续读时地址自动加1一页8字节翻页需要重新指定新的页地址。SCL - GPIOB6SDA - GPIOB7/** *I2CWaitAck()已修改 *启动I2C总线开启写操作0xA0写入指定的地址再次启动I2C总线开启读操作0xA1读取指定地址内数据每次发送字节后需等待I2C总线应答停止I2C总线 *连续读地址自动加1直到最后一个地址 *//** *启动I2C总线开启写操作0xA0写入指定的地址向指定地址写入数据每次发送字节后需等待I2C总线应答停止I2C总线 *连续写地址自动加1直到页边缘AT24C02缓冲区到非易失区需要等待5ms */—AT24C02详细介绍—页写入—IIC通信协议总结—E2PROM读写函数—不同数据类型读写9.ADCSTM32的ADC的输入时钟不得超过14MHzADC转换就是输入模拟的信号量转换成数字量。读取数字量必须等转换完成后完成一个通道的读取叫做采样周期。采样周期一般来说转换时间读取时间而转换时间采样时间12.5个时钟周期。采样时间是你通过寄存器告诉STM32采样模拟量的时间设置越长越精确STM32 的 ADC 最大的转换速率为 1Mhz也就是转换时间为 1us在 ADCCLK14M,采样周期为 1.5 个 ADC 时钟下得到不要让 ADC 的时钟超过 14M否则将导致结果准确度下降单次模式下需要软件或外部事件再触发ADC才进行下一次转换STM32的ADC转换时间是12.5个ADC时钟.然后采样时间可以设置为1.5~239.5个ADC时钟.采样频率ADC时钟/(采样时间12.5)/** *初始化ADC使能ADC校准ADC *GPIOB0 电位器R37模拟输入独立模式单通道单次转换软件触发数据右对齐 *复位校准和开始校准需等待完成 *//** *获取电压值 *PB0ADC通道80 ~ 3.3V12位ADC2^12 - 1 4095 *ADC_FLAG_EOC读取ADC规则数据寄存器(ADC_DR)后自动清除 *//** *获取温度值 *内部温度传感器ADC1通道1612位ADC2^12 4096采样时间大于17.1us温度值 (1.43 - Vsense)V / 4.478mV/℃ 25 */—为什么STM32的ADC转换时钟不能大于14MHz—STM32的单双ADC单双通道配置—STM32的ADC配置详解10.PWM TIM_OCPWM模式TIM_OCMode_PWMx可输出多种波形 ARR设置频率CCR设置占空比占空比可达到0%或100%。STM32的每个通用定时器都有4个输入捕获的通道分别是TIMx_CH1、TIMx_CH2、TIMx_CH3、TIMx_CH4单通道频率和占空比可以任意设置但同意定时器四个通道只能输出频率相同、占空比可变的PWM起始相位不能设置。复用推挽输出。PA1-TIM2_CH2、PA2-TIM2_CH3USART2、PA3-TIM2_CH4、PA6-TIM3_CH1、PA7-TIM3_CH2、TIM_CtrlPWMOutputs(TIMx,ENABLE)函数只对高级定时器有效。/** *定时器2通道2PWM模式初始化 *复用推挽输出定时器设置为1us计数重装载值为1M/pwm频率pwm周期为1/f_freq(f_freq 16)占空比为f_duty *TIM2_CH2PA1输出捕获xTIM_OCx意思是定时器通道x每次TIM_CNT TIM_CCRx和TIM_CNT TIM_ARR时输出电平极性反向 */voidPWM_Init(u32 f_freq,u8 f_duty)/** *定时器2通道2输出比较模式初始化 *复用推挽输出定时器设置为1us计数重装载值为1M/pwm频率pwm周期为1/f_freq(f_freq 16)占空比为f_duty *TIM2_CH2PA1输出捕获xTIM_OCx意思是定时器通道x每次TIM_CNT TIM_CCRx时输出电平极性反向 *//** *输出捕获中断服务函数 *通过不断更改TIM_PulseCCR1值改变频率和占空比 */输出比较模式TIM_OCMode_Toggle 只能输出方波单通道ARR设置频率CCR设置每个通道的初始相位频率和起始相位可以任意设置占空比不能设置。输出频率为理论计算值一半使用定时器捕获中断时同一定时器的四个通道可以分别输出频率和占空比可变的PWM但占空比不能达到0%或100%。修改占空比void TIM_SetComparexTIM_TypeDefTIMxuint16_t Compare2x1234。修改频率void TIM_SetAutoreload(TIM_TypeDefTIMx, uint16_t Autoreload);CCRx值改变时立即生效Disable或发生更新事件后生效EnableTIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);x1234比较输出可调PWM必须CCRx值改变时立即生效。—PWM配置—PWM频率与占空比详解—STM32输出比较模式和PWM模式比较—Keil5中的虚拟示波器进行软件仿真虚拟示波器只能仿真程序遇到LCD初始化或LCD相关函数会进入死循环无法仿真后续程序引脚电平变化。11.TIM_IC同一定时器可以不同通道不同功能。修改捕获的触发方式使用的函数是TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising);输出比较也适用于输入捕获因为他们操作的实际上是同一个地方/** *TIM3_CH2PA7浮空输入上升沿触发中断 *//** *捕获到上升沿定时器清零设置下次捕获下降沿触发 *捕获到下降沿记录时间设置下次捕获上升沿触发 *捕获到上沿记录时间单周期脉冲捕获结束等待捕获开始 */—STM32定时器中的输入捕获滤波器12.DMA—DMA详解13.数码管/** *初始化PA1~3 *PA1SER数据输入每输入一位数据SCK上升沿有效一次直至八位输入完毕 *PA2RCLK移位寄存器与存储寄存器(锁存)的开关上升沿时移位寄存器数据进入存储寄存器下降沿存储寄存器数据不变 *PA3SCK数据传输控制上升沿时数据寄存器数据移位下降沿移位寄存器数据不变 *//** *共阴数码管 *数据传输方向SER1(PA1) - DH1 - SER2 - DH2- SER3 - DH3传输数据顺序先DS3再DS2后DS1 */—蓝桥杯嵌入式扩展板学习之数码管14.ADC按键/** *初始化ADC1_CH5和PA5 *PA5连接AKEY *//** *读取ADC值 *通过按键按下分压值不同判断哪个按键按下 *//*三行代码按键扫描法*/—蓝桥杯嵌入式扩展板学习之ADC按键15.DS18B20/*初始化PA6(TDQ)上拉输入保证充足供电*//** *读取DS18B20温度值 *复位写入OW_SKIP_ROM(0xCC)跳过ROM写入DS18B20_CONVERT(0xCC)开始转换等待750ms *复位写入OW_SKIP_ROM(0xCC)跳过ROM写入DS18B20_READ(0xBE)开始分别读取高八位和低八位先低后高 *高八位(高五位符号位,后三位整数部分2^6~2^4),低八位(高四位整数部分2^0~2^3,后四位小数部分2^-1~2^-4)温度值 总16位 * 0.0625 / 16 */—蓝桥杯嵌入式扩展板学习之DS18B2016.光敏电阻光照越强阻值越小阻值越大电压越大RP7电位器电阻过大可能造成暗度无影响TRDO恒为低电平RP7电位器电阻过小可能造成亮度无影响TRDO恒为高电平。/** *初始化PA3、PA4和ADC1_CH4 *PA3连接TRDO输出数字量0或1PA4连接TRAO输出模拟量ADC转换值 *//** *获取ADC转换值 *0返回电压值(参考电压VDD 3.3V)1返回电阻值(参考电阻R46 10K) */—蓝桥杯嵌入式扩展板学习之光敏电阻17.ADCx2双通道/** *初始化ADC1_CH4与ADC1_CH5 *PA4(AO1-PR5)ADC1_CH4PA5(AO2-PR6)ADC1_CH5 *//*获取电压值(按先后顺序单通道采集)PR5\PR6(MAX:10K)与100分压*/—蓝桥杯嵌入式扩展板学习之ADCx218.DTH11unsigned int dht11_read(void)函数返回32位值高十六位(高8位整数低8位小数)为湿度值%低十六位(高8位整数低8位小数)为温度值摄氏度由于温湿度的分辨率原因读取时只需要整数部分即可。采样周期必须大于2秒。/*初始化PA7(HDQ)*//*获取温湿度值高低16位分别湿度值和温度值*/—蓝桥杯嵌入式扩展板学习之DHT1119.TLC551测量扩展板电位器控制产生频率与产生占空比。/** *TIM2_CH2PA1(PULS1-RP3)TIM2_CH3PA2(PULS2-RP4)TIM3_CH1PA6(PWM1-RP1)TIM3_CH2PA7(PWM2-RP2) *浮空输入上升沿触发中断 *定时器每个通道需要单独配置 *//** *定时器多通道输入捕获使用分时捕获 *捕获到上升沿定时器清零设置下次捕获下降沿触发 *捕获到下降沿记录时间设置下次捕获上升沿触发 *捕获到上沿记录时间单周期脉冲捕获结束等待捕获开始 */—蓝桥杯嵌入式扩展板学习之TLC551测量20.LIS302DL/** *I2C总线初始化 *更改为RCC_APB2Periph_GPIOA时钟使能 *宏定义I2C_PORT改为GPIOASDA_Pin改为GPIO_Pin_5SCL_Pin改为GPIO_Pin_4 *//** *写入LIS302DL寄存器函数 *写指令0x38将数据写入特定地址 *//** *配置LIS302DL *向CTRL_REG1寄存器(0x20)写入指令0x47配置加速度采集频率200Hz普通功耗模式灵敏度为18mg/LSB非自检模式使能XYZ轴加速度采集 *//** *读取LIS302DL寄存器函数 *写指令0x38将数据写入特定地址读指令0x38将数据从特定地址读取 *//** *读取坐标加速度 *判断STATUS_REG寄存器(0x27)的数据更新标志位是否为1(0x08)更新则读取XYZ轴加速度相对值(0~255) *X轴加速度输出寄存器地址0x29Y轴0x2BZ轴0x2D */—蓝桥杯嵌入式扩展板学习之LIS302DL蓝桥杯嵌入式旧板资料包免费下载蓝桥杯嵌入式旧板程序代码免费下载本人通过许多大牛博客自学在大二获得蓝桥杯嵌入式国赛三等奖但自身知识体系沉淀不足借此博客创作过程继续深入学习扩展知识借鉴蓝桥杯嵌入式相关的大牛介绍让自己的技术更进一步。—蓝桥杯嵌入式推荐博客1—蓝桥杯嵌入式推荐博客2************************************************HAL库版本—STM32CUBEMX代码格式优化定时器G4系列通用定时器TIM2和TIM5的重装载值可达到32位—HAL库定时器配置串口每次中断只能接收一个字符输入捕获输入通道需要被测量的信号从定时器的外部引脚 TIMx_CH1/2/3/4 进入通常叫 TI1/2/3/4在后面的捕获讲解中对于要被测量的信号我们都以 TIx 为标准的叫法捕获通道捕获通道就是输入捕获整体结构图中的 IC1/2/3/4每个捕获通道都有相对应的捕获寄存器 CCR1/2/3/4当发生捕获的时候计数器 CNT 的值就会被锁存到捕获寄存器。输入通道是用来输入信号的捕获通道是用来捕获输入信号的通道一个输入通道的信号可以同时输入给两个捕获通道。PWM 输入模式一个输入通道(TIx)会占用两个捕获通道(ICx)所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx)如下图。PWM 信号由输入通道 TI1 进入信号会被分为两路一路是 TI1FP1另外一路是 TI2FP2。其中一路是测周期另一路是测占空比。由此定时器的输入捕获有两个功能直接捕获模式和间接捕获模式直接模式只能捕获本身通道的脉冲信号间接模式可以捕获此定时器每个通道的脉冲信号。auto-reload precloadDisable自动重装载寄存器写入新值后计数器立即产生计数溢出然后开始新的计数周期auto-reload precloadEnable自动重装载寄存器写入新值后计数器完成当前旧的计数后再开始新的计数周期—输入捕获功能配置ADC—adc精度RTC读取时间需要将时间和日期一起读取出来。HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);# 总结 蓝桥杯嵌入式语言相关博客网络资料已经较为齐全以上仅为本人所学的知识总结本文未涉及未学习到的知识点其中链接网址仅作记录使用如有侵权或内容有误敬请联系斧正。若读者觉得本文对学习有所帮助不妨Give a likeRespect

相关新闻