蓝桥杯嵌入式组备赛笔记——模版搭建

一.软件环境搭建
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);

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值