蓝桥杯嵌入式第十三届模拟题做题笔记
这届的蓝桥杯电子类延期了,最近就很无聊,想做点东西但是又什么啥也不会,five一个
在小破站寻求各路大佬的帮助
不求大家的赞了,只希望大家能够分享知识,帮助一下迷茫的人
首先第一眼看到这个题确实是感觉比较简单的,我初始化大概花了40分钟,之后就是逻辑编写了
初始化程序我在第一篇博客里已经写过了,不过好像没写捕获的初始化,因为那时候不会。。
初始化就是要多练几次,发现自己不会的点
有了别人教程的指点,我一直是分模块编写
首先是LCD显示
这里用的是PA1捕获PA6(没有信号发生器),PA2捕获PA7,然后显示出来,
u8 lcd_buf[20];
u8 change=1; //我习惯把第一页写成change1,第二页是2
float V=0;
u8 r=4; //分频系数
_Bool adc_flag=0;
void LCD()
{if(adc_flag){V=ADC_GetConversionValue(ADC1)/4095.f*3.3;TIM3_CH2_duty=V/3.3; }if(change==1){sprintf((char *)lcd_buf," Data");LCD_DisplayStringLine(Line2 ,lcd_buf);sprintf((char *)lcd_buf," FRQ:%dHz ",TIM2Freq);LCD_DisplayStringLine(Line4 ,lcd_buf);sprintf((char *)lcd_buf," FRQ:%dHz ",TTIM2Freq);//作为测试用的,可以注释掉LCD_DisplayStringLine(Line5 ,lcd_buf);sprintf((char *)lcd_buf," R37:%.2fV",V);LCD_DisplayStringLine(Line6 ,lcd_buf);}if(change==2){sprintf((char *)lcd_buf," Para");LCD_DisplayStringLine(Line2 ,lcd_buf);sprintf((char *)lcd_buf," R:%2d",r);LCD_DisplayStringLine(Line4 ,lcd_buf);}}
然后是KEY(这里也没什么技术含量)
_Bool key_flag=0;
u8 option=1;
void KEY()
{if(key_flag){key_flag=0;key_read();if(Trg==0x01){change=change%2+1;LCD_Clear(Black);}if(Trg==0x02){if(change==2){if(r<10)r+=2;}}if(Trg==0x04){if(change==2){if(r>2)r-=2;}}if(Trg==0x08){option=option%2+1;}}
}
下来是LED
void LED()
{if(option==1){if(V<1)led_control(0x04,0);//这里可能写的有点麻烦了,可以自行更改else if(V>=1&&V<3)led_control(0x04,1);elseled_control(0x04,0);if(TIM2Freq<1000)led_control(0x08,0);else if(TIM2Freq>=1000&&TIM2Freq<5000)led_control(0x08,1);elseled_control(0x08,0);}else if(option==2){led_control(0xff,0);}
}
main函数
int main(void)
{SysTick_Config(SystemCoreClock/1000);STM3210B_LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White); led_init(); //初始化key_init();tim4_init();pwm_out();adc_init();cap();CCR1_Val=1000;while(1){CCR2_Val=(1000000/TIM2Freq)*r; //1000000/1000/rLCD();KEY();LED();}
}
TIM4中断函数
void TIM4_IRQHandler(void)
{static u16 key_count=0,adc_count=0;if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM4, TIM_IT_Update);key_count++;adc_count++;if(key_count==10){key_count=0;key_flag=1;}if(adc_count==100){adc_count=0;adc_flag=1;}}
}
pwm.c
#include "pwm.h"__IO uint16_t CCR1_Val = 1000;
__IO uint16_t CCR2_Val = 1000;void pwm_out(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;uint16_t PrescalerValue = 0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);PrescalerValue = (uint16_t) (SystemCoreClock / 1000000) - 1;/* Time base configuration */TIM_TimeBaseStructure.TIM_Period = 65535;TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/* Output Compare Toggle Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);/* Output Compare Toggle Mode configuration: Channel2 */TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = CCR2_Val;TIM_OC2Init(TIM3, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);/* TIM enable counter */TIM_Cmd(TIM3, ENABLE);/* TIM IT enable */TIM_ITConfig(TIM3, TIM_IT_CC2|TIM_IT_CC1 , ENABLE);
}uint16_t capture = 0;
float TIM3_CH1_duty=0.2;
float TIM3_CH2_duty=0.2;
_Bool TIM3_CH1_flag=0;
_Bool TIM3_CH2_flag=0;
void TIM3_IRQHandler(void)
{/* TIM3_CH1 toggling with frequency = 183.1 Hz */if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );capture = TIM_GetCapture1(TIM3);if(TIM3_CH1_flag==1){TIM_SetCompare1(TIM3, capture + (u16)(TIM3_CH1_duty*CCR1_Val ));TIM3_CH1_flag=0;}else{TIM_SetCompare1(TIM3, capture + (u16)((1-TIM3_CH1_duty)*CCR1_Val ));TIM3_CH1_flag=1;}}/* TIM3_CH2 toggling with frequency = 366.2 Hz */if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);capture = TIM_GetCapture2(TIM3);if(TIM3_CH2_flag==1){TIM_SetCompare2(TIM3, capture + (u16)(TIM3_CH2_duty*CCR2_Val ));TIM3_CH2_flag=0;}else{TIM_SetCompare2(TIM3, capture + (u16)((1-TIM3_CH2_duty)*CCR2_Val ));TIM3_CH2_flag=1;}}
}
pwm.h
#ifndef _PWM_H_
#define _PWM_H_#include "stm32f10x.h"extern __IO uint16_t CCR2_Val,CCR1_Val;
extern float TIM3_CH2_duty;
void pwm_out(void);#endif
cap.c
#include "cap.h"void cap()
{TIM_ICInitTypeDef TIM_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/* GPIOA and GPIOB clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter = 0x0;TIM_ICInit(TIM2, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;TIM_ICInit(TIM2, &TIM_ICInitStructure);/* TIM enable counter */TIM_Cmd(TIM2, ENABLE);/* Enable the CC2 Interrupt Request */TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_CC3, ENABLE);TIM_PrescalerConfig(TIM2,72-1,TIM_PSCReloadMode_Update);}__IO uint16_t IC3ReadValue1 = 0, IC3ReadValue2 = 0;
__IO uint16_t CaptureNumber = 0;
__IO uint32_t Capture = 0;
__IO uint32_t TIM2Freq = 0;__IO uint16_t TIC3ReadValue1 = 0, TIC3ReadValue2 = 0;
__IO uint16_t TCaptureNumber = 0;
__IO uint32_t TCapture = 0;
__IO uint32_t TTIM2Freq = 0;
void TIM2_IRQHandler(void)
{ if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) {/* Clear TIM3 Capture compare interrupt pending bit */TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);if(CaptureNumber == 0){/* Get the Input Capture value */IC3ReadValue1 = TIM_GetCapture2(TIM2);CaptureNumber = 1;}else if(CaptureNumber == 1){/* Get the Input Capture value */IC3ReadValue2 = TIM_GetCapture2(TIM2); /* Capture computation */if (IC3ReadValue2 > IC3ReadValue1){Capture = (IC3ReadValue2 - IC3ReadValue1); }else{Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2); }/* Frequency computation */ TIM2Freq = (uint32_t) SystemCoreClock /72/ Capture;CaptureNumber = 0;}}if(TIM_GetITStatus(TIM2, TIM_IT_CC3) == SET) {/* Clear TIM3 Capture compare interrupt pending bit */TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);if(TCaptureNumber == 0){/* Get the Input Capture value */TIC3ReadValue1 = TIM_GetCapture3(TIM2);TCaptureNumber = 1;}else if(TCaptureNumber == 1){/* Get the Input Capture value */TIC3ReadValue2 = TIM_GetCapture3(TIM2); /* Capture computation */if (TIC3ReadValue2 > TIC3ReadValue1){TCapture = (TIC3ReadValue2 - TIC3ReadValue1); }else{TCapture = ((0xFFFF - TIC3ReadValue1) + TIC3ReadValue2); }/* Frequency computation */ TTIM2Freq = (uint32_t) SystemCoreClock /72/ TCapture;TCaptureNumber = 0;}}
}
cap.h
#ifndef _CAP_H_
#define _CAP_H_#include "stm32f10x.h"extern __IO uint32_t TIM2Freq;
extern __IO uint32_t TTIM2Freq;
void cap(void);#endif
OK,至此就完成了所有功能,总体来说也没写多少东西,比起第八届,第十二届的逻辑也简单好多,大家加油,争取有个好成绩
蓝桥杯嵌入式第十三届模拟题做题笔记相关推荐
- 蓝桥杯嵌入式第十三届省赛真题1
源码在这需要的可以自取 目录 1 题目 2 分析 3 项目结构 3.1 LCD显示部分 3.2 按键控制部分 3.3 密码部分 3.4 LED部分 3.5 数据处理部分 3.6 PWM控制部分 3.7 ...
- 蓝桥杯嵌入式第十届省赛真题
蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...
- 蓝桥杯嵌入式|第十三届蓝桥杯嵌入式省赛程序设计试题及其题解
题目 十三届省赛是要制作一个可由串口设置密码的密码锁.在本场比赛中,我们将用到LED模块.按键模块.串口模块.定时器的PWM模块以及官方会提供源码的LCD模块.下面就请看原题: 题解 ...
- 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器
第九届省赛真题电子定时器 第九届省赛真题 主函数代码(不包含各模块初始化代码) 按键模块与LCD模块的逻辑图(仅供参考) 第九届省赛真题 主函数代码(不包含各模块初始化代码) #include &qu ...
- 蓝桥杯嵌入式第十三届第一场省赛真题
一.程序设计题 A.CubeMx 1.选用80MHZ时钟.SW线 2.GPIO配置 3.TIM2_Channel2 4.串口USART1 选择PA9.PA10引脚,DAM传输.使能空闲中断 5.中断优 ...
- 蓝桥杯嵌入式第七届模拟题 代码
链接:https://pan.baidu.com/s/1fdGC20A51axxPGpoyRL8-w 提取码:by4u
- 蓝桥杯嵌入式第七届省赛——“模拟液位检测告警系统”旧板标准库
一.赛题分析 模拟液位检测告警系统,涉及到KEY.ADC.EEPROM.LED.USART.LCD等模块.本届赛题相对简单,各个模块均可在往期文章中找到配置方法和编写说明.如: 蓝桥杯嵌入式--第六届 ...
- 蓝桥杯单片机第十三届第二场
第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...
- 2021第十二届蓝桥杯B组省赛C/C++做题过程与反思
2021第十二届蓝桥杯B组省赛C/C++做题过程与反思 鄙人大一,第一次有幸参加蓝桥杯b组c.以下是本人的做题全过程,注意了!!!!不一定是正确答案!! 如果有误,还请大佬们指点指点. 试题 A: ...
最新文章
- 一、Git 多人协作模拟实战
- Elasticsearch: too many open files
- Navicat中无法自定义标量值函数的问题
- 如何自定义Struts2表单验证后的错误信息显示格式
- ASP.Net Mvc 发布网站 (样式+图片问题)
- paip.51cto HTML转码规则
- 数据传输类型与通信方式
- [附源码]Java计算机毕业设计SSM电影票网上订票系统
- 宝藏又小众的室内场景unity3d模型素材网站分享
- GIS要学哪种计算机语言,做好一名ArcGIS开发人员所需要掌握的知识
- Error: L6218E: Undefined symbol LED_Init (referred from main.o).
- linux 升级php 5.3,Linux PHP5.3升级PHP5.5.33 (CentOS)
- JBOSS启动错误:Not pointing to a directory
- 七号信令中TUP协议的主要消息和故障问题
- Java后端开发工程师
- 大家都在用哪些OKR管理工具?
- 照片太大了怎么改小kb?图片压缩在线处理方法
- 第一章 MySQL数据库的简介
- 信而泰BigTao6000网络测试仪使用说明
- 可变形卷积在视频学习中的应用:如何利用带有稀疏标记数据的视频帧