STM32CubeMX配置
之后打开中断
实验代码
#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 "stdio.h"
#include "Interrupt.h"
#include "AAdc.h"
#include "i2c_hal.h"
#include "string.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern struct Keys key[]; //可以在main函数中直接操作这个变量(在Interrupt.c中的)
extern uint Frq1,Frq2;
extern char RxData[30];
extern uint8_t RxDat;
extern uchar Rx_Pointer; //进行到哪一步了
uchar view = 0; //界面显示标志
uchar PA6_Duty = 10; //PA6的占空比
uchar PA7_Duty = 10; //PA7的占空比
//可以改成结构体
char car_type[5];
char car_data[5];
char car_time[13];
void Key_proc(void);
void Disp_proc(void);
void Uart_Rx_Proc(void);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Key_proc();
Disp_proc();
if(Rx_Pointer != 0)
{
int temp = Rx_Pointer;
HAL_Delay(1);
if(temp == Rx_Pointer){Uart_Rx_Proc();}
} //防止接收不完整的情况
//串口发送
// char temp[20];
// sprintf(temp, "Frq = %d\r\n", Frq1);
// HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp), 50); //函数作用:串口发送一个数据
}
void Key_proc(void)
{
if(key[0].Single_Flag == 1)
{
view++;
if(view==3){view = 0;}
LCD_Clear(Black);
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);//将特定定时器占空比设为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);//将特定定时器占空比设为PA7_Duty的数值
key[2].Single_Flag = 0;
}
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;
}
}
void Disp_proc(void)
{
if(view == 0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text," FRQ1=%dHz ",Frq1);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," FRQ2=%dHz ",Frq2);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
sprintf(text," V=%.2f ",GetADC(&hadc1));
LCD_DisplayStringLine(Line6, (uint8_t *)text);
sprintf(text," V=%.2f ",GetADC(&hadc2));
LCD_DisplayStringLine(Line7, (uint8_t *)text);
uint eep_temp = (eeprom_read(1)<<8) + eeprom_read(2);
sprintf(text," FRQ_eep=%d ",eep_temp);
LCD_DisplayStringLine(Line8, (uint8_t *)text);
}
if(view == 1)
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text," PA6:%d%% ",PA6_Duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," PA7:%d%% ",PA7_Duty);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
}
if(view == 2)
{
char text[30];
sprintf(text," Car ");
LCD_DisplayStringLine(Line0, (uint8_t *)text);
sprintf(text," Car_type:%s ",car_type);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," Car_data:%s ",car_data);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
sprintf(text," Car_time:%s ",car_time);
LCD_DisplayStringLine(Line7, (uint8_t *)text);
}
}
void Uart_Rx_Proc(void)
{
if(Rx_Pointer > 0)
{
if(Rx_Pointer == 22)
{
sscanf(RxData,"%4s:%4s:%12s", car_type, car_data, car_time);
//作用:把RxData分为3部分将4位放入car_type中
}else
{
char temp[5];
sprintf(temp, "Error");
HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp), 50);
}
Rx_Pointer = 0; memset(RxData, 0, 30);
}
}
没了