STM32G431RBT6 HAL库使用记录
//LED
gpio口配置输出时
置0或1函数,HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
锁存器 PD2,置1时打开,PC8到PC15可以正常读写
//KEY
gpio口配置输入时
读取当前值函数,HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
KEY读取值,逻辑if(key1 == 0){
HAL_Delay(10);
if(key1 == 0){
while(key1 == 0;
return 1;)}}
//UART
HAL_UART_RxCpltCallback //弱定义,可重新拿出写入main,数据完全接受完成后调用
当HAL_UART_Receive_IT调用的时候,会进入中断,串口中断模式接收
因为中断接收函数只能触发一次接收中断,所以我们需要在中断回调函数中再调用一次中断接收函数
具体流程:
1、初始化串口
2、在main中第一次调用接收中断函数
3、进入接收中断,接收完数据 进入中断回调函数
4、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据,
5、回调函数中要调用一次HAL_UART_Receive_IT函数,使得程序可以重新触发接收中断
//LCD
"stdio.h"
"string.h"
strcmp(const char *s1, const char *s2) //比较返回,1>2返回正数,1=2返回0,1<2返回负数
memset(void *a, int b, size_t c)
sprintf(char * restrict, const char * restrict, ...);
LCD_DisplayStringLine(u8 Line, u8 *ptr)
//ADC
HAL_ADC_Start(&hadcx) 启动adc数据
HAL_ADC_GetValue(&hadcx) 获取adc值
//EE
u8 i2c_read(u8 add)
{
unsigned char val;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(0xa1);
I2CWaitAck();
val = I2CReciveByte();
I2CWaitAck(); / I2CSendAck();
I2CStop();
return val;
}
u8 i2c_write(u8 add, u8 data)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}
//TIM
HAL_TIM_Base_Start_IT(&htimx) //计时溢出进入tim_base回调函数
溢出值计算:(arr+1)*(psc+1) / clk = 溢出进入回调函数时间
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //里写入自己算法
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1) //启动PWM
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,10) //设置PWM高脉冲
频率是5hz 相当于5秒变化5个周期,来回5次,10个方向变化
频率 :clk/(arr+1)*(psc+1) (单位:Hz) //通过psc分频,频率再除以一个周期,获得产生波形的总频率
占空比:P = pulse/arr
HAL_TIM_IC_Start_IT //高级定时器
HAL_TIM_IC_CaptureCallback //内部捕获回调函数
时钟:80 000 000 /80(预分频系数) = 1 000 000 HZ= 1MHZ,所以计数一次为1us
最大计数值为65536(重装载值),约为65ms
__HAL_TIM_GET_COUNTER(&htim2) //获取定时器计数值
__HAL_TIM_SET_COUNTER(&htim2) //清零定时器计数值
当前产生的波型频率 = 分频后频率 / 定时器计数值
//EXIT
按键中断
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //回调函数