嵌入式—蓝桥杯
基本操作
stm32G431RBTx
RCC: 外部时钟HSE SYS: Serial Wire IDE:MDK-ARM
1.Debug
: CMSIS-DAP Debugger Settngs
: reset and run
2.MDK-ARM同级目录下创建 bsp
文件夹;勾选自动生成.c/.h文件
3.在K5下面加上bsp
文件,右键添加.c文件
4.C/C++
:include path
加上test\bsp
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "interrup.h"
#include "kadc.h"
#include "stdint.h"
#include "i2c.h"
#include "stm32_hal_legacy.h"
#include "string.h"
LED
pd2:锁存器控制端口 高电平使能
pc8-pc15 gpio_output
GPIO output Level:high
void LED_Disp(uchar dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
#ifndef _LED_H
#define _LED_H
#include "main.h"
void LED_Disp(uchar dsLED);
#endif
#define uchar unsigned char;
#define uint unsigned int;
LED_Disp(0x00); //初始化
LED_Disp (0x01);//00000001;while 1
HAL_Delay(500);
LED_Disp (0x2E);//00101110
HAL_Delay(500);
LCD
官方库——INC/SRC中的.c/.h文件 放到bsp文件中
LCD的初始化
GPIO_INPUT 引脚配置
NVIC中将中断进行使能
#include "interrup.h"
extern struct keys key[4]; //main.c
HAL_TIM_Base_Start_IT(&htim3);
#include "interrup.h"
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3);
for (int i=0;i<4;i++)
{
switch(key[i].judge_sta)
{
case 0:
{
if(key[i].key_sta==0)
key[i].judge_sta=1;
key[i].key_time=0;
}
break ;
case 1: //消除抖动
{
if(key[i].key_sta==0){
key[i].judge_sta=2;
}
else key[i].judge_sta=0;
}
break ;
case 2:
{
if(key[i].key_sta==1)
{
key[i].judge_sta=0;
if(key[i].key_time<70)
{
key[i].single_flag=1;
}
}
else
{
key[i].key_time++;
if(key[i].key_time>70)
{
key[i].long_flag=1;
}
}
}
break ;
}
}
}
}
uchar ccrl_val1=0,ccrl_val2=0;
uint frq1=0,frq2=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2) //定时器锁定到TIM2
{
ccrl_val1 = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1 );
__HAL_TIM_SetCounter(htim,0);
frq1 = (80000000/80)/ccrl_val1;
HAL_TIM_IC_Start(htim,0);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
if(htim->Instance==TIM3)
{
ccrl_val2 = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1 ); //计时值
__HAL_TIM_SetCounter(htim,0); //清零
frq2 = (80000000/80)/ccrl_val2; //频率=80兆/分频系数/计时值
HAL_TIM_IC_Start(htim,0);
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
}
#ifndef __INTERRUP_H
#define __INTERRUP_H
#include "main.h"
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
struct keys
{
uchar judge_sta;
uchar key_sta; //按下为0
uchar single_flag; //确认按下为1,短按键
uchar long_flag; //长按键
uint key_time;
};
#endif
切换界面
key_proc
disp_proc
void key_proc();
void disp_proc();
key_proc();
disp_proc();
void key_proc(void)
{
if(key[0].single_flag ==1)
{
LCD_Clear(Blue);
view=!view;
// HAL_Delay(5000);
key[0].single_flag =0;
}
}
PWM/脉冲输出
HAL_TIM_PWM_Start (&htim16 ,TIM_CHANNEL_1); //pwm输出开启
HAL_TIM_PWM_Start (&htim17 ,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); //频率测量定时器捕获
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
void key_proc(void)
{
if(key[0].single_flag ==1)
{
// LCD_Clear(Blue);
view=!view;
// HAL_Delay(5000);
key[0].single_flag =0;
}
if(key[1].single_flag ==1)
{
pa6_duty+=10;
if(pa6_duty>=100) pa6_duty=10;
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
key[1].single_flag =0;
}
if(key[2].single_flag ==1)
{
pa7_duty+=10;
if(pa7_duty>=100) pa7_duty=10;
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
key[2].single_flag =0;
}
}
void disp_proc(void)
{
// LCD_Clear(Blue);
if(view==0)
{
LCD_Clear(Blue);
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine ( Line6, (uint8_t*)text);
// LCD_DisplayStringLine ( Line0, (uint8_t*)text);
// sprintf(text," FRQ1:%d ",frq1);
// LCD_DisplayStringLine ( Line2, (uint8_t*)text);
// sprintf(text," FRQ2:%d ", frq2);
// LCD_DisplayStringLine ( Line4, (uint8_t*)text);
}
if(view==1)
{
LCD_Clear(Blue);
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine ( Line1, (uint8_t*)text);
LCD_DisplayStringLine ( Line0, (uint8_t*)text);
sprintf(text," PA6:%d ",pa6_duty);
LCD_DisplayStringLine ( Line2, (uint8_t*)text);
sprintf(text," PA7:%d ",pa7_duty);
LCD_DisplayStringLine ( Line4, (uint8_t*)text);
//2 key[1].single_flag =0;
}
}
捕获计数器(频率、占空比
PA15、PB4