一.软件环境搭建
1.配置时钟树,作为系统时钟——80MHz
2.选择systick定时器
3.设置页选择生成模块文件
二.cube配置
1.GPIO设置(key+led)
led的配置范围——GPIOC,GPIO_PIN_8-GPIOC,GPIO_PIN_15包括锁存器PD2
PC8-PC15配置为默认高电平,推挽输出,无上下拉
PD2设置为默认低电平,推完输出,无上下拉
2.串口配置,使用Usart异步模式就相当于UART
PA9-PA10前者设置为usart_tx,后者设置为usart_rx模式
选择USART1,模式设置为异步模式
波特率设置为9600bit/s,由于发送接收时需要用到中断,故需要配置
3.adc配置
PB12设置为ADC1的通道11即R38;同理PB15设置为ADC2的通道15t即R37
通道11配置为single ended,ADC2的通道15同理
- 这是ADC的常规模式。在这种模式下,ADC只测量一个输入信号,通常与某个参考电压(如Vref+或Vref-)进行比较。
- 对于ADC1的通道十一,如果设置为single-ended模式,那么ADC将只测量该通道上的模拟信号,并将其转换为数字值。
配置为异步二分频
转换精度为640.5cycles
注意配置为异步模式时候需要将时钟树adc的始终来源从systick改为锁相环pll
4.TIM配置(难点)
主要包含基本定时器配置、输入捕获配置(通常为内部信号发生器信号捕获或者外部信号捕获),输出比较模式
1.基本定时器配置,tim6
周期T=80000000/(79+1)*(999+1)=1000ms,每隔一秒进入一次中断
故需要配置中断
2.输入捕获模式,以PA2的TIM15_ch1为例
而蓝桥杯的官方板子内部两个信号发生器输出引脚为PA15和PB4,故通常使用TIM2和3来捕获
配置为从模式即达到阈值自动复位,用于得到两个上升沿之间的计数值即通道一得到的计数值
用1MHz/通道一计数值=整个频率。ti1fp1将通道一数据上传,ti2fp2将通道二计数值上传.咱们使用的是通到一故使用ti1fp1。采用内部时钟,通道一直接捕获模式,通道二间接捕获模式。
内部时钟八十分频即1000000Hz,通道一捕获上升沿,通道二捕获下降沿
3.输出比较模式,以输出一个1KHz,占空比为40%的PWM为例
使用的是PA15的tim2_channel1,配置为产生pwm波模式,使用内部时钟,自动重装载需要使能
5.RTC时钟
话不多说,RTC启动!!!再加上一个这个——万年历
125*6000将时钟树的RTC时钟改为HSE_RTC
三.模版代码编写
1.GPIO部分代码编写
三行代码
uckey_value = key_scan();
uckey_down = uckey_value & (uckey_value ^ uckey_old);
uckey_up = ~uckey_value & (uckey_value ^ uckey_old);
uckey_old = uckey_value;
2.BSP\adc自己添加代码
uint16_t getadc1(void)
{
uint16_t adc = 0;
HAL_ADC_Start(&hadc1);
adc = HAL_ADC_GetValue(&hadc1);
return adc;
}
uint16_t getadc2(void)
{
uint16_t adc = 0;
HAL_ADC_Start(&hadc2);
adc = HAL_ADC_GetValue(&hadc2);
return adc;
}
3.BSP\iic自写代码分为24c02和mcp4017两部分
24c02
oid iic_24c02_write(uint8_t *pucbuf,uint8_t ucAddr,uint8_t num)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(ucAddr);
I2CWaitAck();
while(num--)
{
I2CSendByte(*pucbuf++);
I2CWaitAck();
}
I2CStop();
delay1(500);
}
void iic_24c02_read(uint8_t *pucbuf,uint8_t ucAddr,uint8_t num)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(ucAddr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
while(num--)
{
*pucbuf++ = I2CReceiveByte();
if(num)
I2CSendAck();
else
I2CSendNotAck();
}
I2CStop();
}
mcp4017
//mcp4017的相关代码
void iic_4017_write(uint8_t value)
{
I2CStart();
I2CSendByte(0x5E);
I2CWaitAck();
I2CSendByte(value);
I2CWaitAck();
I2CStop();
}
uint8_t iic_4017_read(void)
{
uint8_t value;
I2CStart();
I2CSendByte(0x5F);
I2CWaitAck();
value = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return value;
}
4.BSP\uart
1.窗口发送功能
sprintf(uart_tx,"xiaopa\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)uart_tx,strlen(uart_tx),50);
2.串口接收中断功能
开启接受中断
HAL_UART_Receive_IT(&huart1,(uint8_t*)&uart_rx,1);
编写中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if((uart_rx[0] == 'o') && (uart_rx[1] == 'k'))
{
sprintf(uart_tx,"hello\r\n");
HAL_UART_Transmit(&huart1,(uint8_t*)uart_tx,strlen(uart_tx),50);
HAL_UART_Receive_IT(&huart1, (uint8_t*)uart_tx,2);
}
}
5.BSP\tim(重点)
1.基本定时器,开启中断以及编写中断回调函数
2.修改PWM占空比代码操作
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1, 800);