一.串口通信
extern放在main.h中
需要初始化
//define
uint8_t RX[20];
uint8_t TX[20];
uint8_t Recount=0;
extern DMA_HandleTypeDef hdma_usart1_rx;
//main
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_Receive_DMA(&huart1,RX,20);
//back function
void Rec_Control()
{
HAL_UART_Transmit_DMA(&huart1,RX,strlen((char*)TX));
}
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
Recount = 20 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
Rec_Control();
Recount = 0;
HAL_UART_Receive_DMA(&huart1,RX,20);
}
//check function
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
HAL_UART_IdleCpltCallback(&huart1);
}
二.
ADC
double R_37=0;
double R_38=0;
uint8_t str[20];
void Get_R37()
{
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2,10);
int temp1 = HAL_ADC_GetValue(&hadc2);
R_37 = temp1*3.3/4096;
HAL_ADC_Stop(&hadc2);
}
void Get_R38()
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
int temp2 = HAL_ADC_GetValue(&hadc1);
R_38 = (temp2*3.3)/4096;
}
void Show()
{
Get_R37();
Get_R38();
sprintf((char*)str," R37 %.2fV",R_37);
LCD_DisplayStringLine(Line4,str);
sprintf((char*)str," R38 %.2fV",R_38);
LCD_DisplayStringLine(Line5,str);
}
DAC
开头要填写开始函数
HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);
结束要有Stop函数
void Set_Value(float r39,float r40)
{
int temp1 = (r39*4096)/3.3;
int temp2 = (r40*4096)/3.3;
HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,temp1);
HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,temp2);
HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_1);
HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_2);
}
DAC的一生
配置的时候只需要选择一个就够了
void DAC_Value(uint16_t r39,uint16_t r40)
{
HAL_DAC_Start(&hdac1,DAC1_CHANNEL_1);
HAL_DAC_Start(&hdac1,DAC1_CHANNEL_2);
int temp1 = r39*4096/3.3;
int temp2 = r40*4096/3.3;
HAL_DAC_SetValue(&hdac1,DAC1_CHANNEL_1,DAC_ALIGN_12B_R,temp1);
HAL_DAC_SetValue(&hdac1,DAC1_CHANNEL_2,DAC_ALIGN_12B_R,temp2);
HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_1);
HAL_DAC_Stop(&hdac1,DAC1_CHANNEL_2);
}
三.PWM
PWM-OUT的一生
配置的时候开启时钟源以及输出通道,配置参数
void Change_Fre(uint16_t Fre)
{
htim3.Init.Prescaler = Fre;
HAL_TIM_Base_Init(&htim3);
}
void PWM_Control()
{
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,500);
Change_Fre(499);
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_2);
}
void Change_Fre()
{
htim3.Instance = TIM3;
htim3.Init.Prescaler = 79;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 500;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
}
IN
单边沿检测,只看频率
HAL_TIM_IC_Start_IT(&htim16,TIM_CHANNEL_1);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ccl_value = __HAL_TIM_GET_COUNTER(&htim16);
__HAL_TIM_SetCounter(&htim16,0);
f39 = 1000000/ccl_value;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ccl_value = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
f39 = 1000000/ccl_value;
int temp = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
duty = temp*100/ccl_value;
}
四,RTC
获取日期和时间的都写上,否则会出现错误
获取时间
void Get_Time()
{
HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
HAL_RTC_GetAlarm(&hrtc,&alarm,RTC_ALARM_A,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
}
常规时间展示
void time()
{
RTC_DateTypeDef date;
RTC_TimeTypeDef time;
HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
sprintf((char*)TX," %d-%d-%d ",date.Year,date.Month,date.Date);
LCD_DisplayStringLine(Line0,TX);
sprintf((char*)TX," %d:%d:%d ",time.Hours,time.Minutes,time.Seconds);
LCD_DisplayStringLine(Line1,TX);
}
暂停&&重启RTC
__HAL_RCC_RTC_DISABLE();
__HAL_RCC_RTC_ENABLE();
重新设定时间
void Set_Time()
{
__HAL_RCC_RTC_DISABLE();
HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
HAL_RTC_GetAlarm(&hrtc,&alarm,RTC_ALARM_A,RTC_FORMAT_BIN);
time.Hours++;
alarm.AlarmTime.Hours++;
__HAL_RCC_RTC_ENABLE();
}
void Set_Time()
{
RTC_TimeTypeDef sTime = {0};
sTime.Hours = 14;
sTime.Minutes = 32;
sTime.Seconds = 12;
sTime.SubSeconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
选中的时间部分高亮
LCD_DisplayChar(Line4,320-(16*4),'R');
LCD_DisplayChar(Line4,320-(16*5),'T');
LCD_DisplayChar(Line4,320-(16*6),'C');
LCD_DisplayChar(Line4,320-(16*7),':');
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,320-(16*8),time.Hours/10+'0');
LCD_DisplayChar(Line4,320-(16*9),time.Hours%10+'0');
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,320-(16*10),':');
LCD_DisplayChar(Line4,320-(16*11),time.Minutes/10+'0');
LCD_DisplayChar(Line4,320-(16*12),time.Minutes%10+'0');
LCD_DisplayChar(Line4,320-(16*13),':');
LCD_DisplayChar(Line4,320-(16*14),time.Seconds/10+'0');
LCD_DisplayChar(Line4,320-(16*15),time.Seconds%10+'0');
五.EEPROM
void Write(unsigned char address,unsigned char info)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(info);
I2CWaitAck();
I2CStop();
}
uint8_t Read(unsigned char address)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
unsigned char val = I2CReceiveByte();
I2CStop();
return val;
}
第一次上电
void Init()
{
if(Read(0x00)!=20)
{
HAL_Delay(10);Write(0x00,20);HAL_Delay(10);
Write(0x01,51);HAL_Delay(10);
}
else if(Read(0x00)==20)
{
HAL_Delay(10);
value = Read(0x01);HAL_Delay(10);
Write(0x01,value+1);HAL_Delay(10);
}
}
六.按键扫描
#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
typedef enum
{
key_check,
key_press,
key_release,
}Key_State;
Key_State keystate = key_check;
uint16_t key_count=0;
uint16_t key_scan=0;
uint16_t key_flag=0;
uint16_t key_time=20;
uint16_t key_value=0;
//PART1--KEY
void Key_Scan()
{
if(key_scan==1)
{
switch (keystate)
{
case key_check:
{
if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
{
keystate = key_press;
}
}
break;
case key_press:
{
if(B1==GPIO_PIN_RESET){keystate = key_release;key_value=1;}
else if(B2==GPIO_PIN_RESET){keystate = key_release;key_value=2;}
else if(B3==GPIO_PIN_RESET){keystate = key_release;key_value=3;}
else if(B4==GPIO_PIN_RESET){keystate = key_release;key_value=4;}
}
break;
case key_release:
{
if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
{
key_time = key_time+10;
}
else
{
keystate = key_check;
key_flag=1;
}
}
break;
}
}
}
void Key_Control()
{
if(key_flag==1)
{
key_flag=0;
if(key_value==1)
{
key_value=0;
lcd_state++;
}
else if(key_value==2)
{
key_value=0;
if(lcd_state%3==1)
{
rtc_high++;
}
}
else if(key_value==3)
{
key_value=0;
}
else if(key_value==4)
{
key_value=0;
}
}
}
七.LCD
void LCD_Show()
{
if(lcd_show==1)
{
lcd_show=0;
if(lcd_state%2==0)
{
}
else
{
}
}
}