蓝桥杯
- 1.创建工程
- 2.LED灯点亮
-
- 3.LCD液晶屏显示
-
- 4.定时器按键单机
-
- interrupt.h
- interrupt.c
- man.c
- 5.定时器(长按键)
-
- interrupt.h
- interrupt.c
- main.c
- 6.PWM
-
- 7.定时器-输入捕获(频率,占空比测量)
-
- 8.ADC模数转换
-
- 9.IIC
-
- 10.uart串口通信
-
- 11.printf串口打印
- 12.屏幕反转
- 13.空闲中断DMA
-
- 第一种方法
-
- 1.1main.c
- 1.2main.h
- 1.3stm32g4xx_it.c
- 第二种方法
-
1.创建工程
![在这里插入图片描述](http://img.e-com-net.com/image/info8/0b52f71ec94e4bbb9b8d76c4dfb6458a.jpg)
![【蓝桥杯_练习】_第1张图片](http://img.e-com-net.com/image/info8/4368d9266c1344dcb9c1e1f321fd386d.jpg)
![【蓝桥杯_练习】_第2张图片](http://img.e-com-net.com/image/info8/f1b017e2d7bc4b998bc17cded9a8d1c5.jpg)
![【蓝桥杯_练习】_第3张图片](http://img.e-com-net.com/image/info8/a1614b4893214b62bc9083f386cfa544.jpg)
![【蓝桥杯_练习】_第4张图片](http://img.e-com-net.com/image/info8/d1bebf47769548cc9db5d2e9a28c76ac.jpg)
![【蓝桥杯_练习】_第5张图片](http://img.e-com-net.com/image/info8/e4ff399d99b24390978121e6f708a168.jpg)
![【蓝桥杯_练习】_第6张图片](http://img.e-com-net.com/image/info8/e2952cc5c2f2416998c855a1a41527e7.jpg)
![【蓝桥杯_练习】_第7张图片](http://img.e-com-net.com/image/info8/85cb51cb866f4cf99d5e503b99b76314.jpg)
![【蓝桥杯_练习】_第8张图片](http://img.e-com-net.com/image/info8/b6b5acb01d4d479ca2e330b7e9de72d5.jpg)
2.LED灯点亮
![【蓝桥杯_练习】_第9张图片](http://img.e-com-net.com/image/info8/75a252609550479cad454739925ba177.jpg)
![【蓝桥杯_练习】_第10张图片](http://img.e-com-net.com/image/info8/74878c06e87b4ee0aa2f29037a5d36f6.jpg)
![【蓝桥杯_练习】_第11张图片](http://img.e-com-net.com/image/info8/492b4ff5510949479678b5f6a577dc06.jpg)
![【蓝桥杯_练习】_第12张图片](http://img.e-com-net.com/image/info8/c0cb389881b54aaa90c6cc94784db7e8.jpg)
![【蓝桥杯_练习】_第13张图片](http://img.e-com-net.com/image/info8/c459dfac1ccb43d3b88109e183fd1fd2.jpg)
![【蓝桥杯_练习】_第14张图片](http://img.e-com-net.com/image/info8/49e9b7da45ec40ecbca72fe8dd42a46a.jpg)
![【蓝桥杯_练习】_第15张图片](http://img.e-com-net.com/image/info8/b732020709484b43b4ef04aa76f2eec0.jpg)
![【蓝桥杯_练习】_第16张图片](http://img.e-com-net.com/image/info8/bc6ba5948eba4e11890a6f06706841e3.jpg)
![【蓝桥杯_练习】_第17张图片](http://img.e-com-net.com/image/info8/516b2cada5c1406a932581072b7ff0d9.jpg)
![【蓝桥杯_练习】_第18张图片](http://img.e-com-net.com/image/info8/cebd6b69ac0147079e6af472ab77576d.jpg)
![【蓝桥杯_练习】_第19张图片](http://img.e-com-net.com/image/info8/9366ccac5bdc442eab00ab265d1b7b7b.jpg)
led.c
#include "main.h"
#include "gpio.h"
#include "led.h"
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);
}
main()
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
LED_Disp(0x00);
while (1)
{
LED_Disp(0x00);
HAL_Delay(500);
LED_Disp(0xff);
HAL_Delay(500);
}
}
3.LCD液晶屏显示
![【蓝桥杯_练习】_第20张图片](http://img.e-com-net.com/image/info8/3d66c6b2277b4b0ca38758788eb97ba7.jpg)
![【蓝桥杯_练习】_第21张图片](http://img.e-com-net.com/image/info8/e9200abccce245e381d796c62bdb73e6.jpg)
![【蓝桥杯_练习】_第22张图片](http://img.e-com-net.com/image/info8/cadf0f18403e403897753cfa79b6c8ec.jpg)
![【蓝桥杯_练习】_第23张图片](http://img.e-com-net.com/image/info8/e3bde2d9327548648538231e6767d0e9.jpg)
![【蓝桥杯_练习】_第24张图片](http://img.e-com-net.com/image/info8/d16c4984c6d74d85b7876391bb83b07a.jpg)
![【蓝桥杯_练习】_第25张图片](http://img.e-com-net.com/image/info8/25d6d89f5c314cdca2dbba5caf98254b.jpg)
![【蓝桥杯_练习】_第26张图片](http://img.e-com-net.com/image/info8/bfa8c9cd6c7f407cab20bf5599d115df.jpg)
lcd.c
int main(void)
{
char text[30];
uint i=5;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
sprintf(text," SCH%d ",i);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
while (1)
{
HAL_Delay(500);
}
}
4.定时器按键单机
![【蓝桥杯_练习】_第27张图片](http://img.e-com-net.com/image/info8/12527b766acb4dd9ad23d72c51080c7a.jpg)
![【蓝桥杯_练习】_第28张图片](http://img.e-com-net.com/image/info8/0ae3f3a2e63f4a1d8f73131c5ae7325c.jpg)
![【蓝桥杯_练习】_第29张图片](http://img.e-com-net.com/image/info8/390f207c378244a387eba0bf1b048371.jpg)
![【蓝桥杯_练习】_第30张图片](http://img.e-com-net.com/image/info8/2cea16af3f924ee385b8f3969cecf923.jpg)
![【蓝桥杯_练习】_第31张图片](http://img.e-com-net.com/image/info8/2c88400ca7c64ef09c324d501a876e9c.jpg)
![【蓝桥杯_练习】_第32张图片](http://img.e-com-net.com/image/info8/3381327811324ad38571c0b509041335.jpg)
![【蓝桥杯_练习】_第33张图片](http://img.e-com-net.com/image/info8/283e41e409b44c2b9275b2b794da5040.jpg)
![【蓝桥杯_练习】_第34张图片](http://img.e-com-net.com/image/info8/496a391220134688ac3ca44869e8fef2.jpg)
interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include "main.h"
#include "stdbool.h"
struct keys
{
uchar judge_sta;
bool key_sta;
bool single_flag;
};
#endif
interrupt.c
#include "interrupt.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(GPIOA,GPIO_PIN_0);
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;
else
key[i].judge_sta=0;
}
break;
case 1:
{
if(key[i].key_sta==0)
{
key[i].judge_sta=2;
key[i].single_flag=1;
}
else
key[i].judge_sta=0;
}
break;
case 2:
{
if(key[i].key_sta==1)
{
key[i].judge_sta=0;
}
}
break;
}
}
}
}
man.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
extern struct keys key[];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim3);
char text[30];
while (1)
{
if(key[0].single_flag==1)
{
key[0].single_flag=0;
sprintf(text," Key0 ");
LCD_DisplayStringLine(Line8, (uint8_t *)text);
}
if(key[1].single_flag==1)
{
key[1].single_flag=0;
sprintf(text," Key1 ");
LCD_DisplayStringLine(Line8, (uint8_t *)text);
}
}
}
5.定时器(长按键)
interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include "main.h"
#include "stdbool.h"
struct keys
{
uchar judge_sta;
bool key_sta;
bool single_flag;
bool long_flag;
uint key_time;
};
#endif
interrupt.c
#include "interrupt.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(GPIOA,GPIO_PIN_0);
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;
}
else
key[i].judge_sta=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;
}
}
}
}
main.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
extern struct keys key[];
uchar view;
void key_pro(void);
void disp_pro(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim3);
while (1)
{
key_pro();
disp_pro();
}
}
void key_pro(void)
{
if(key[0].single_flag==1)
{
view=!view;
key[0].single_flag=0;
}
}
void disp_pro(void)
{
if(view==0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
else
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
}
6.PWM
![【蓝桥杯_练习】_第35张图片](http://img.e-com-net.com/image/info8/297e12d8bdf94826a274d1035e6c9b95.jpg)
![【蓝桥杯_练习】_第36张图片](http://img.e-com-net.com/image/info8/27bbd55ce32e45d89f81134c73e0b014.jpg)
![【蓝桥杯_练习】_第37张图片](http://img.e-com-net.com/image/info8/ca27fcb0a85241408c09f9113fd234d7.jpg)
![【蓝桥杯_练习】_第38张图片](http://img.e-com-net.com/image/info8/b755ef9848c24d69977687d667567763.jpg)
![在这里插入图片描述](http://img.e-com-net.com/image/info8/2bc0556c835c43b99d3a1bfa5b108ae4.jpg)
![【蓝桥杯_练习】_第39张图片](http://img.e-com-net.com/image/info8/cb475aa93f35497c84654a15718a8e38.jpg)
![【蓝桥杯_练习】_第40张图片](http://img.e-com-net.com/image/info8/13a1de6d082f4ca5af927d37ba223213.jpg)
![【蓝桥杯_练习】_第41张图片](http://img.e-com-net.com/image/info8/57b2895916514037bc6b393f9c1a6793.jpg)
![【蓝桥杯_练习】_第42张图片](http://img.e-com-net.com/image/info8/2caa3f241d794ab29a3491b9386d9edb.jpg)
![【蓝桥杯_练习】_第43张图片](http://img.e-com-net.com/image/info8/d5a47993494e4fcdb340ab0eb680e6b9.jpg)
main.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
extern struct keys key[];
uchar view;
uchar pa6_duty=10;
uchar pa7_duty=10;
void key_pro(void);
void disp_pro(void);
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
while (1)
{
key_pro();
disp_pro();
}
}
void key_pro(void)
{
if(key[0].single_flag==1)
{
view=!view;
LCD_Clear(Black);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
pa6_duty=pa6_duty%90+10;
__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1,pa6_duty);
key[1].single_flag=0;
}
if(key[2].single_flag==1)
{
pa7_duty=pa7_duty%90+10;
__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1,pa7_duty);
key[2].single_flag=0;
}
}
void disp_pro(void)
{
if(view==0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
else
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text," PA6:%d ",pa6_duty);
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text," PA7:%d ",pa7_duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
}
}
7.定时器-输入捕获(频率,占空比测量)
![【蓝桥杯_练习】_第44张图片](http://img.e-com-net.com/image/info8/232405401ca7452883bbc981e030c298.jpg)
![【蓝桥杯_练习】_第45张图片](http://img.e-com-net.com/image/info8/4678444dbd8d47429fbcda1be28e6ceb.jpg)
![【蓝桥杯_练习】_第46张图片](http://img.e-com-net.com/image/info8/037f4aa9f9fa46e9874b2388224a21a9.jpg)
![【蓝桥杯_练习】_第47张图片](http://img.e-com-net.com/image/info8/4cccffd3460942e3965267053d0b6e6e.jpg)
![【蓝桥杯_练习】_第48张图片](http://img.e-com-net.com/image/info8/565b7a9f63c14988824da0ee9772d7bb.jpg)
![【蓝桥杯_练习】_第49张图片](http://img.e-com-net.com/image/info8/0fbbaae3a475420596406d69d72b5373.jpg)
![【蓝桥杯_练习】_第50张图片](http://img.e-com-net.com/image/info8/233fdfc6a936448dadfcac42111d5b66.jpg)
![【蓝桥杯_练习】_第51张图片](http://img.e-com-net.com/image/info8/c2536fb1ee924509a92d5fcfea31aba4.jpg)
![【蓝桥杯_练习】_第52张图片](http://img.e-com-net.com/image/info8/197c83d1cb4c4733ac5a78f94d671f7a.jpg)
interrupt.c
#include"interrupt.h"
double ccr1_val1a=0,ccr1_val2a=0;
double ccr1_val1b=0,ccr1_val2b=0;
uint frq1=0,frq2=0;
float duty1=0,duty2=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr1_val1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
ccr1_val1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
__HAL_TIM_SetCounter(htim,0);
frq1=(80000000/80)/ccr1_val1a;
duty1=(ccr1_val1b/ccr1_val1a)*100;
}
}
if(htim->Instance==TIM3)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr1_val2a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
ccr1_val2b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
__HAL_TIM_SetCounter(htim,0);
frq2=(80000000/80)/ccr1_val2a;
duty2=(ccr1_val2b/ccr1_val2a)*100;
}
}
}
main.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;
uchar view;
uchar pa6_duty=10;
uchar pa7_duty=10;
void key_pro(void);
void disp_pro(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
MX_TIM2_Init();
MX_TIM4_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);
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);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
while (1)
{
key_pro();
disp_pro();
}
}
void key_pro(void)
{
if(key[0].single_flag==1)
{
view=!view;
LCD_Clear(Black);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
pa6_duty=pa6_duty%90+10;
__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1,pa6_duty);
key[1].single_flag=0;
}
if(key[2].single_flag==1)
{
pa7_duty=pa7_duty%90+10;
__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1,pa7_duty);
key[2].single_flag=0;
}
}
void disp_pro(void)
{
if(view==0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text," FRQ1=%d ",frq1);
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text," duty1=%.3f ",duty1);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," FRQ2=%d ",frq2);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
sprintf(text," duty2=%.3f ",duty2);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
}
else if(view==1)
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line1, (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);
}
}
8.ADC模数转换
![【蓝桥杯_练习】_第53张图片](http://img.e-com-net.com/image/info8/06a4e360356240399e9366512ec184b1.jpg)
![【蓝桥杯_练习】_第54张图片](http://img.e-com-net.com/image/info8/79f3fe203d8048dd85bb9adf16dc7a84.jpg)
![【蓝桥杯_练习】_第55张图片](http://img.e-com-net.com/image/info8/3f357b635f3f4119bf8cfb2b910d3a3d.jpg)
![【蓝桥杯_练习】_第56张图片](http://img.e-com-net.com/image/info8/bfd8ad0ec3124190a2333624c43d7dd5.jpg)
![【蓝桥杯_练习】_第57张图片](http://img.e-com-net.com/image/info8/0b6a0d3bbaf0469399b2b1c55c962568.jpg)
myadc.h
#ifndef _MYADC_H_
#define _MYADC_H_
#include "main.h"
double getADC(ADC_HandleTypeDef *pin);
#endif
myadc.c
#include "myadc.h"
double getADC(ADC_HandleTypeDef *pin)
{
uint adc;
HAL_ADC_Start (pin);
adc = HAL_ADC_GetValue (pin);
return adc*3.3/4096;
}
main.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"
extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;
uchar view;
uchar pa6_duty=10;
uchar pa7_duty=10;
void key_pro(void);
void disp_pro(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
MX_TIM2_Init();
MX_TIM4_Init();
MX_ADC1_Init();
MX_ADC2_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);
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);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
while (1)
{
key_pro();
disp_pro();
}
}
void disp_pro(void)
{
if(view==0)
{
char text[30];
sprintf(text," ADC1=%.2f ",getADC(&hadc1));
LCD_DisplayStringLine(Line6, (uint8_t *)text);
sprintf(text," ADC2=%.2f ",getADC(&hadc2));
LCD_DisplayStringLine(Line7, (uint8_t *)text);
}
else if(view==1)
{
}
}
9.IIC
![【蓝桥杯_练习】_第58张图片](http://img.e-com-net.com/image/info8/b14c26ffb151481b9d24036ecac882f8.jpg)
![【蓝桥杯_练习】_第59张图片](http://img.e-com-net.com/image/info8/649491c247004621b18817f1c8029891.jpg)
![【蓝桥杯_练习】_第60张图片](http://img.e-com-net.com/image/info8/b71c8aaf859d4684b6e1ab7d6777457d.jpg)
![【蓝桥杯_练习】_第61张图片](http://img.e-com-net.com/image/info8/55f6ba21b3bf4d65a6af5cc4821409a9.jpg)
i2c - hal.c
#include "i2c - hal.h"
uchar eeprom_read(uchar addr)
{
uchar dat;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
dat=I2CReceiveByte();
I2CStop();
return dat;
}
void eeprom_write (uchar addr,uchar dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
HAL_Delay(10);
}
main.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"
#include "i2c - hal.h"
extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;
uchar view=0;
uchar pa6_duty=10;
uchar pa7_duty=10;
void key_pro(void);
void disp_pro(void);
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
MX_TIM2_Init();
MX_TIM4_Init();
MX_ADC1_Init();
MX_ADC2_Init();
LED_Disp(0x00);
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);
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);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
while (1)
{
if(key[3].single_flag==1)
{
uchar frq_h=frq1>>8;
uchar frq_l=frq1&0xff;
eeprom_write(1,frq_h);
HAL_Delay(10);
eeprom_write(2,frq_l);
key[3].single_flag=0;
}
uint eeprom_val=(eeprom_read(1)<<8)+eeprom_read(2);
sprintf(text," FRQ_eep=%d ",eeprom_val);
LCD_DisplayStringLine(Line8, (uint8_t *)text);
}
}
10.uart串口通信
![【蓝桥杯_练习】_第62张图片](http://img.e-com-net.com/image/info8/d366597b68b748d7a6d3080f32fc76cf.jpg)
![【蓝桥杯_练习】_第63张图片](http://img.e-com-net.com/image/info8/14da568703d242d6b42e897cd5ae6de5.jpg)
![【蓝桥杯_练习】_第64张图片](http://img.e-com-net.com/image/info8/e049032ea61c44c988dfb53db348692a.jpg)
interrupter.c
char rxdata[30];
uint8_t rxdat;
uchar rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat)
{
rxdata[rx_pointer++]=rxdat;
HAL_UART_Receive_IT(&huart1,&rxdat,1);
}
mian.c
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"
#include "i2c - hal.h"
#include "string.h"
extern struct keys key[];
extern char rxdata[30];
extern uint8_t rxdat;
extern uchar rx_pointer;
uchar view=0;
char car_type[5];
char car_data[5];
char car_time[13];
void key_pro(void);
void disp_pro(void);
void uart_rx_proc(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
MX_TIM2_Init();
MX_TIM4_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_USART1_UART_Init();
LED_Disp(0x00);
LCD_Init();
HAL_UART_Receive_IT(&huart1,&rxdat,1);
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
while (1)
{
key_pro();
disp_pro();
if(rx_pointer!=0)
{
int temp=rx_pointer;
HAL_Delay(1);
if (temp==rx_pointer)uart_rx_proc();
}
}
}
void key_pro(void)
{
if(key[0].single_flag==1)
{
view=0;
LCD_Clear(Black);
key[0].single_flag=0;
}
}
void disp_pro(void)
{
if(view==0)
{
char text[30];
sprintf(text," Car_msg ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text,"car_type=%s ",car_type);
LCD_DisplayStringLine(Line2, (uint8_t *)text);
sprintf(text,"car_data=%s ",car_data);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text,"cat_time=%s ",car_time);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
}
void uart_rx_proc()
{
if(rx_pointer>0)
{
if(rx_pointer==22)
{
sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);
}
else
{
char temp[20];
sprintf(temp,"Error");
HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);
}
rx_pointer=0;memset(rxdata,0,30);
}
}
11.printf串口打印
int fputc(int ch, FILE * f)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xfff);
return ch;
}
12.屏幕反转
LCD_WriteReg(R1 , 0x0000);
LCD_WriteReg(R96 , 0x2700);
LCD_WriteReg(R1 , 0x0100);
LCD_WriteReg(R96 , 0xA700);
13.空闲中断DMA
- 定义一个接收缓冲的数组,不能低于你的最大传输数据量
- 初始化串口
- 初始化串口DMA(循环)
- 打开IDLE中断
- 开启DMA传输
- 在中断函数中判断IDLE中断是否执行
- 清空IDLE标志位
- 停止DMA传输(处理数据防止干扰)
- 获取数据长度
- 接收缓冲数组数据末尾加上 ‘\0’
- 发送接收缓冲区数据,验证接收
- 重新打开DMA
![【蓝桥杯_练习】_第65张图片](http://img.e-com-net.com/image/info8/6dffd7e0e75e4154a08927828c801e32.jpg)
![【蓝桥杯_练习】_第66张图片](http://img.e-com-net.com/image/info8/a99d9ffc9ce54850ba324fdc0eb8b6a7.jpg)
![【蓝桥杯_练习】_第67张图片](http://img.e-com-net.com/image/info8/b52dd19958af4a118a45b02d2b0ab939.jpg)
第一种方法
1.1main.c
int main(void)
{
printf("Please enter arbitrary length characters:\r\n");
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);
HAL_UART_Receive_DMA(&huart1,(uint8_t*)Rx_buff,buff_count);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
while(1)
{
}
}
1.2main.h
typedef unsigned char uchar;
typedef unsigned int uint;
#define buff_count 100
extern uint8_t Rx_buff[buff_count];
extern uint32_t Rx_Length;
1.3stm32g4xx_it.c
uint8_t Rx_buff[buff_count];
uint32_t Rx_Length = 0;
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_IDLE);
HAL_UART_DMAStop(&huart1);
Rx_Length = buff_count - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
Rx_buff[Rx_Length] = '\0';
HAL_UART_Transmit_DMA(&huart1,(uint8_t*)Rx_buff,Rx_Length);
HAL_UART_Receive_DMA(&huart1,(uint8_t*)Rx_buff,buff_count);
}
}
第二种方法
2.1main.c
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart->Instance == USART1)
{
HAL_UART_Transmit_DMA(&huart1, Rx_buff, Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Rx_buff,buff_count);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
}
}
int main(void)
{
printf("Please enter arbitrary length characters:\r\n");
HAL_UARTEx_ReceiveToIdle_DMA(&huart1,Rx_buff,buff_count);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
while(1)
{
}
}
2.2main.h
typedef unsigned char uchar;
typedef unsigned int uint;
#define buff_count 10
extern uint8_t Rx_buff[buff_count];