GPIO的应用:
led的应用:
Cube MX配置:
代码编写:
void GPIO_LED(uint8_t wei)
{
HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET); //选中开发板的8颗LED灯
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //选中LED灯所在的锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //
HAL_GPIO_WritePin(GPIOC,wei<<8,GPIO_PIN_RESET); //选中所需的LED灯点亮
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
按键检测
Cube MX配置:
代码编写:
uint8_t ucKey_Val,ucKey_Down,ucKey_Up,ucKey_Old;
uint8_t Key_Scan() //读取按键的函数,读取按键值
{
uint8_t unKey_Val=0;
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET) unKey_Val=4; //读取
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET) unKey_Val=1; //
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET) unKey_Val=2; //
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET) unKey_Val=3; //
return unKey_Val; //返回值
}
void Key_Proc(void) //按键检测值
{
ucKey_Val = Key_Scan();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); //下降沿
ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val); //上升沿
ucKey_Old = ucKey_Val;
}
IIC总线:
代码编写:
void IIC_24c02_write(uint8_t *p,uint8_t Add,uint8_t Nem)
{
I2CStart(); //起始信号
I2CSendByte(0xa0); //发送字节
I2CWaitAck(); //等待响应
I2CSendByte(Add);
I2CWaitAck();
while(Nem--)
{
I2CSendByte(*p++);
I2CWaitAck();
}
I2CStop(); //结束信号
delay1(500);
}
void IIC_24c02_read(uint8_t *p,uint8_t Add,uint8_t Nem)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
while(Nem--)
{
*p++=I2CReceiveByte();
if(Nem)
I2CSendAck(); //发送确认信号
else
I2CSendNotAck(); //发送非确认信号
}
I2CStop();
delay1(500);
}
void IIC_mcp4017_writch(uint8_t value)
{
I2CStart();
I2CSendByte(0x5E);
I2CWaitAck();
I2CSendByte(value);
I2CWaitAck();
I2CStop();
}
uint8_t IIC_mcp4017_read(void)
{
uint8_t value;
I2CStart();
I2CSendByte(0x5F);
I2CWaitAck();
value=I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return value;
}
//
uint8_t x24c02_read(uint8_t address)
{
unsigned char val;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
val = I2CReceiveByte();
I2CWaitAck();
I2CStop();
return(val);
}
//
void x24c02_write(unsigned char address,unsigned char info)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CSendByte(info);
I2CWaitAck();
I2CStop();
}
ADC的使用
Cube MX 配置
程序代码:
uint16_t GetADC1(void)
{
uint16_t adc=0;
HAL_ADC_Start(&hadc1);
adc= HAL_ADC_GetValue(&hadc1);
return adc;
}
..........................................................................
..........................................................................
HAL_Delay(100);
sprintf((char *)TX_001,"电压R38:%1.2f V\n",((float)GetADC1())/4028*3.3);
HAL_UART_Transmit(&huart1,TX_001,sizeof(TX_001),50);
...........................................................................
...........................................................................
//两个ADC采集Cude MX一样的配置,注意选择就好.程序也是一样的。
HAL_Delay(100);
sprintf((char *)TX_001,"电压R38:%1.2f V\r电压R37:%1.2f V\n",((float)GetADC1())/4096*3.3,((float)GetADC2())/4096*3.3);
HAL_UART_Transmit(&huart1,TX_001,sizeof(TX_001),50);
定时器TIM
定时器中断:
TIM6
80MHz
100ms
Cube MX配置:
记得开中断哦!!!
Cube MX 配置:
程序代码:
HAL_TIM_Base_Start_IT(&htim6); //开启定时器6;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //定时器更新回调函数
{
if(htim->Instance==TIM6)
{
//定时器6的回调函数
}
}
PWM捕获:
定时器2和定时器3的配置一样,要开中断,在中断里做处理,GPIO口的配置。
Cube MX 配置:
程序代码:
uint16_t PWM1_T_Count;
uint16_t PWM1_D_Count;
uint16_t PWM2_T_Count;
uint16_t PWM2_D_Count;
float PWM1_Duty;
float PWM2_Duty;
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
PWM1_T_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
PWM1_Duty =(float)PWM1_D_Count/PWM1_T_Count;
}
else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
{
PWM1_D_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
}
}
} //*另一个PWM捕获一样的用法*//
/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
{
PWM1_T_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;
PWM1_Duty =(float)PWM1_D_Count/PWM1_T_Count;
}
else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
{
PWM1_D_Count = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/
//写在it文件中
sprintf((char*)TX_001,"R40P:%05dHz,%4.1f%%\n",(uint16)(1000000/PWM1_T_Count),PWM1_Duty*100);
PWM输出:
不需要开中断
其他的都需要:
Cube MX 配置:
6000是600
程序代码:
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//开启
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//
__HAL_TIM_SET_AUTORELOAD(&htim16,TIM_CHANNEL_1); //改变频率//TIM_CHANNEL_1==值
__HAL_TIM_SET_COMPARE(&htim16,TIM_CHANNEL_1,100); //改变占空比
HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&Y_M_D_data,RTC_FORMAT_BIN);
sprintf((char *)TX_001,"Data:%02d-%02d-%02d-%d\n",Y_M_D_data.Year,(unsigned int)Y_M_D_data.Month,(unsigned int)Y_M_D_data.Date,Y_M_D_data.WeekDay);
RTC_TimeTypeDef H_M_S_Time;
RTC_DateTypeDef Y_M_D_data;
RTC_DateTypeDef Y_M_D_data_S;