十五届蓝桥杯嵌入式省赛备赛笔记

负一、考纲(15届)

逻辑运算(番外)

  • 异或 ^ :简单的说,符号两边的数据相同,那么结果为0;符号两边数据不同,那么结果为1;
  • 或 | : 进行或运算的两个数据中,只要有一个数据非0,那么结果就为1;
  • 与 &:进行与运算的两个数据中,只要有一个数据数据为0,那么结果就为0;

微控制器手册(可以查)

  • 寄存器
  • Clock tree

客观题

1. 电路基础[1-3]

时序电路的输出与当前输入和原来状态有关。

2. 电子元件 a) 元器件选型、特点与工作参数[3] b) 元器件封装与符号[3]

为了使运算放大器(Operational Amplifier,简称Op-Amp)工作在线性区域,它应该处于负反馈状态。

3. 数模电路 a) 数制与编码[3] b) 二极管、三极管、基础门电路[1-3] c) 运算放大器、滤波器[1-4] d) AD、DA 转换[1-4] e) 电源转换[2-4]
晶体管 

晶体管的穿透电流Iceo(也记作ICEO),穿透电流随着温度的升高而显著增加,因此Iceo的大小直接影响了晶体管工作的温度稳定性

AD\DA转换

实现A/D转换的方法

  • 计数法
  • 双积分法
  • 逐次逼近法

选D

模拟/数字转换器的分辨率可以通过以下哪些指标来判断( C)。 A. 允许输入模拟电压的范围 B. 运算放大器的放大倍数 C. 输出二进制数字信号的位数 D. 以上均不正确

分辨率是指ADC能够将输入的模拟信号细分成多少个等级或离散的数字值,它直接对应于输出的二进制数字信号的位数。例如,一个16位ADC可以产生2^16个不同的输出值,从而能够更精确地表示输入模拟信号的变化。

允许输入模拟电压的范围(A选项)是ADC的另一个重要参数,但它不直接决定分辨率,而是决定了ADC能够处理的电压幅度。运算放大器的放大倍数(B选项)通常是在前置放大或信号调理电路中影响信号强度的参数,它也不直接影响ADC的分辨率。

可以直接相连实现线与的门电路是OD门(开漏输出门)与 OC门(开集极电路门)。

三态门是一种逻辑电路,它可以有三种状态:高电平、低电平、高阻态

时序组合电路:

  • 寄存器
  • 计数器
  • 触发器
  • 分频器

组合电路:

  • 译码器

电压增益,表示放大电路对输入信号的放大能力,使用的表示方法是分贝表示法,其公式定义为:Gu=20lg(Uo/Ui)=20lgAu,Au表示放大倍数,Gu单位是分贝,用符号dB表示。
因此,可以得到-20 = 20lgAu,可得Au = 0.1。

放大电路的电压放大倍数和通频带的乘积基本为常数

放大电路的开环,是指未经反馈通路形成的独立放大电路

4. 工具仪表使用[1-5]

5. STM32 微控制器
a) 外设[3-5]
 内核级别外设

  • NVIC
  • SCB
  • SysTick
  • MPU
  • FPU
DMA

DMAMUX

STM32 微控制器的片内 FLASH 存储器一次可以写入( 16)位。

b) 性能与工作参数[3-5]

c) STM32 典型应用场景[4-6]

6. 通信总线

a) SPI[4] b) USART/RS485/RS232[4] c) I2C[4] d) CAN[5-6] e) USB[5-6] f) 以太网[5-6]

USB

USB是"Universal Serial Bus"(通用串行总线)的缩写,是一种广泛应用在计算机、移动设备和其他电子设备之间的接口标准,用于连接外部设备并进行数据传输和电力供应。它允许用户“即插即用”(plug-and-play),无需重新启动计算机即可识别和使用接入的设备,并且支持热插拔,即在计算机运行时插入或拔出USB设备。

USB拓扑结构的特点是主机位于中心,设备通过集线器构成分支,形成一种分层的星型结构。

差分方式传输是一种利用两条信号线传输一对互补信号的技术,这种方式可以有效抵抗共模噪声干扰,提高信噪比和传输距离。以下是一些采用差分传输技术的常见协议:

1. **RS-485**:工业控制系统中广泛使用的串行通信标准,适用于长距离、多节点的数据通信,支持多点传输,具有良好的抗电磁干扰性能。

2. **RS-422**:类似于RS-485,也是一种平衡传输接口标准,主要区别在于其支持全双工通信,适合长距离、高速率的数据传输。

3. **LVDS(Low Voltage Differential Signaling)**:低压差分信号技术,用于高速数据传输,尤其在显示接口、网络通信等领域有广泛应用,如DisplayPort、HDMI等接口。

4. **PCI-E(Peripheral Component Interconnect Express)**:高速计算机扩展总线标准,在显卡、声卡、网卡等高速设备间使用,其信号传输采用差分对形式。

5. **Ethernet(以太网)**:现代以太网(包括10BASE-T、100BASE-TX、1000BASE-T等)普遍采用差分信号进行数据传输,以减少电磁干扰并提高传输速率。

6. **USB(Universal Serial Bus)**:USB 2.0及更高版本的数据线采用了差分信号传输,例如在高速模式下的D+/D-线对。

7. **SATA(Serial ATA)**:硬盘驱动器等存储设备接口,使用差分信号进行高速数据传输。

8. **MIPI(Mobile Industry Processor Interface)**:针对移动设备的接口标准,其中的某些子协议如D-PHY、M-PHY等采用差分信号传输。

9. **TIA/EIA-854 TDMA IS-95 (CDMA) digital cellular system**:在无线通信领域,某些通信标准也会采用差分信号技术。

10. **NMEA 0183 over RS-422**: 在航海和GPS导航系统中,为了增强信号传输质量,NMEA 0183协议可以通过RS-422接口以差分方式进行传输。

11. **CAN(Controller Area Network)总线**:在汽车电子和其他嵌入式系统中,CAN总线的物理层也有采用差分信号传输的版本,如CAN-High和CAN-Low线对。

以上这些协议均利用了差分信号的优势来提高数据传输的可靠性和效率。

USART/RS485/RS232

全双工(Full Duplex)串行通信是指在通信过程中,数据能够在同一时间内沿着两条独立的传输通路(通常是一对线,每条线承载相反极性的信号)同时进行双向传输。这意味着通信的双方(如两个设备或节点)既可以发送数据,也可以接收数据,而且两者可以同时进行,互不影响。

I2C(微控制器参考手册)

  • I2C:双线,即SDA与SDL,不需要共地;
  • SPI:四线,即CS、CLK、MOSI、MISO,因为有CLK总线连接,也就是相当于共地;
  • UART:三线,即RX、TX、GND,这里有一个明确的地线,也就是会共地;
  • RS485:九线,其中有一条就是地线,因此也会共地;
SPI

CAN

以太网

7. 传感器应用[4-6]

8. ARM 微控制器基础 [6]

STM32系列微控制器的程序可以在ROM、RAM上运行,但不可以在E2PROM和寄存器上运行。

打开cubemx查看

volatile:确保系统总是重新从它所在的内存读取数据,保证读取数据的稳定和准确性(不被编译器优化)

函数指针的格式为返回值类型 (*函数名) (参数列表)

主观题

零、环境配置

keil代码补全

keil pack包

或者直接点击pack安装

SW

Flash Download:reset and run

cubemx配置安装包

一、LED

cubemx配置PD2引脚为输出模式

uint16_t led_value = 0x00;
void led_set(uint8_t led_dis)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,led_dis<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);    
}
void led_single_on(uint8_t turn)
{
    led_value = led_value | (0x01<<(turn - 1));
    led_set(led_value);
}
void led_single_off(uint8_t turn)
{
    led_value = led_value & (~(0x01<<(turn - 1)));
    led_set(led_value);
}

void led_single_on(uint8_t turn);
void led_single_off(uint8_t turn);

通过位运算实现单独的led操作而不影响其他led灯的正常显示,便于实现led的同时闪烁和分别控制,成功解决和led灯冲突的问题

二、EPPEROM(I2C)

初始化

初始化函数【无需在cubemx配置引脚】,在while(1)前面初始化配置一下🆗,下面这个函数在提供的I2C函数里有

void I2CInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}

 EEPROM--AT24C02只有对写操作有时间间隔要求,对读操作没有间隔要求

由上图可以得知,AT24C02读时间间隔为5ms

HAL_Delay(5);    //延时5ms--AT24C02写时序要求

 根据芯片手册时序图编写读写函数

//字节写函数
void at24c02_Byte_Write(unsigned char addr,unsigned char cSendByte)
{
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CSendByte(cSendByte);
    I2CWaitAck();
    I2CStop();
}

//随机读
unsigned char at24c02_Byte_read(unsigned char addr)
{
    unsigned char dat;
    I2CStart();
    I2CSendByte(0xa0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CStart();
    I2CSendByte(0xa1);
    I2CWaitAck();
    dat = I2CReceiveByte();
    I2CSendNotAck();
    I2CStop();
    return dat;
}

三、LCD

1.LCD基本显示问题

#include "stdio.h"  //进入sprintf函数的头文件

sprintf () 可以将格式化输出发送到一个字符串中

使用示例:

        sprintf(text,"    Liquid Level     ");
        LCD_DisplayStringLine(Line1,(u8*)text);

2.高亮某一行 

        if(set_sel == Sel_3){
            LCD_SetBackColor(Yellow);
        }
        sprintf(text," Threshold_3:  %2dcm     ",Threshold_3);
        LCD_DisplayStringLine(Line7,(u8*)text);      
        LCD_SetBackColor(Black);    

 设置set_sel用于选择高亮的某一行

在显示前设置高亮背景颜色

在显示后设置回默认的背景颜色

3.高亮某个字符

void highlight(uint8_t *str,uint8_t pos)
{
	int i = 0;
	for(i = 0; i <= 20; i++)
	{
		if(i != pos && i!= (pos+1))
			LCD_DisplayChar(Line3,(320 - (16 * i)),str[i]);
	}
	LCD_SetBackColor(Yellow);
	LCD_DisplayChar(Line3,(320 - (16 * pos)),str[pos]);
    LCD_SetBackColor(Yellow);
    LCD_DisplayChar(Line3,(320 - (16 * (pos+1))),str[pos+1]);
	LCD_SetBackColor(Black);	
}

使用示例:

四、串口

1.串口重定向

#include "stdio.h"
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);
    return ch;
}

 

2.串口中断

3.串口DMA

4.不定长数据接收

  HAL_UARTEx_ReceiveToIdle_DMA(&huart1,receive_data,sizeof(receive_data));
  __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if(huart->Instance == USART1)
    {
       k = (receive_data[3]-'0')/10.0;
       AT24C02_FLAG = 1; 
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1,receive_data,sizeof(receive_data));
        __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
    }
                                              
}

5.指令解析

6.sscanf的使用

五、TIM

1.PWM输出(多通道脉冲输出/信号发生器)

  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);  //PA6--PWM输出
  HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1); //PA7--PWM输出

2.PWM占空比

①初始化配置

②修改比较值

__HAL_TIM_SetCompare(    );

3.PWM频率设置

__HAL_TIM_SET_PRESCALER(&htim2,80-1);

4.输入捕获,双通道测量频率和占空比

    HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
    HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
uint16_t cnt_rising=0, cnt_falling=0;
uint16_t freq=0;
float IC_duty;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim -> Instance == TIM3)
	{
		if(htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			cnt_rising = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;
			freq = (80000000/80) / cnt_rising;
			IC_duty = ((float)cnt_falling/cnt_rising)*100;
		}
		if(htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		{
			cnt_falling = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;
		}
	}
}

5.RTC时钟

      HAL_RTC_GetTime(&hrtc,&rtc_time,RTC_FORMAT_BIN);
      HAL_RTC_GetDate(&hrtc,&rtc_h_ti,RTC_FORMAT_BIN);

6.定时器实现闪烁/步进

六、按键

短按

长按+短按

按键处理函数

七、ADC(电位器)

ADC校准

HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准

ADC读取值

勾选ADC2  IN15 Single-ended,其他选项默认

HAL_ADC_Start(&hadc2);
HAL_ADC_GetValue(&hadc2);
double getADCvalue(void)
{
    HAL_ADC_Start(&hadc2);
    HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准
    uint32_t value = HAL_ADC_GetValue(&hadc2);
    ADC_get_flag = 0;
    return (value*3.3)/4095.0;
}

4095——>分辨率12bit   

过采样(G4系列)

Oversampling Right Shift和Oversampling Ratio设置为对应的。

double getADCvalue(void)
{
    HAL_ADC_Start(&hadc2);
    HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准
    uint32_t value = HAL_ADC_GetValue(&hadc2);
    ADC_get_flag = 0;
    return (value*3.3)/4095.0;
}

硬件滤波

软件滤波(一阶互补滤波)

double first_filter(double new_val,double old_val,float rate)
{
    return  (new_val*rate + old_val*(1-rate)); 
}

八、考试调试

①printf

②LCD

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值