蓝桥杯电子赛----嵌入式赛道备赛LED
部分内容来源于以下文章:【STM32】STM32系统时钟RCC_stm32中的rcc-CSDN博客
【HAL库与CubeMX】CubeMX中的SYS配置选项
一、stm32开发方式
1、基本库开发
2、HAL库开发(利用STM32CubeMX,通过可视化编程操作,自动生成代码)
3、LL库开发
4、寄存器开发
二、使用stm32CubeMX和keil5新建工程
在一般工程中,通用的配置是开启时钟(RCC配置)、以及HAL初始化配置(SYS配置)
1、先选择芯片stm32G431RB(查看CT117E-M4产品手册)
2、创建项目
3、RCC复位和时钟控制(Reset and Clock Control)
Disable:禁用外部时钟
BYPASS Clock Resource:外部有源晶振(旁路时钟源)
Crystal/Ceramic Resonator:外部无源晶振(陶瓷晶振)
RCC的概念
在STM32中,RCC(Reset and Clock Control)是时钟和复位控制模块它负责管理系统时钟的生成和分配,以及控制外设的复位和时钟开启/关闭
RCC的主要功能包括:
a. 时钟源选择:RCC可以选择不同的时钟源,比如内部振荡器、外部晶振等。
b. 时钟配置:可以配置主时钟、外设时钟等,以满足不同外设的工作频率需求。
c. 复位控制:RCC可以对各个外设进行复位,确保在系统初始化时外设处于已知状态。
d. 时钟使能/禁用:动态地开启或关闭外设的时钟,以节省功耗,通过RCC配置开发者可以优化STM32的性能和功耗,确保系统在不同工作条件下稳定运行。
4、SYS配置
1. 在STM32CubeMX的SYS选项栏中有SW和JTAG协议选项,用户可以根据需要选择相应的协议。
1)JTAG调试接口(JTAG-DP)需要5个引脚;CubeMX中可选择5pin或4pin的JTAG,5pin比4pin多了一个复位引脚。
2)SW调试接口(SW-DP)需要2个引脚。二者之间有复用引脚。SW调试端口采用同步串行协议:SWCLK引脚为从主机到从机的时钟信号;SWDIO为双向数据信号。3)什么情况用什么接口
a. ST-Link采用的是SW调试接口,选择Serial Wire ;
b. J-Link采用的是JTAG调试接口,根据实际要求选择 JTAG(4pin) 或者 JTAG(5pin) ;
c. 如果使用J-Link 但是采用SWD协议,也可以选择Trace Asynchronous Sw ;
Trace Asynchronous Sw 模式有时候也可以解决使用ST-Link 烧录之后无法烧录和调试的情况。4)为了避免一次烧录之后无法下一次烧录或者调试的情况, 推荐选择Serial Wire。
如果在STM32CubeMX中选择SW协议,MDK 也必须 选择SW协议。JTAG协议配置也同理。否则会造成下载和调试失败。在实际项目中SW协议使用的比较多,速度更快,占用的引脚更少,推荐配置成SW协议,即Serial Wire模式。
如果选择的是SW协议,在MDK中要按下图操作。
2. System Wake-Up :
设置低功耗模式下的自动唤醒功能,通过引脚PA0。3. Timebase Source :
一般指HAL的时基,即HAL库中的uwTick,用于实现HAL_Delay()以及作为各种timeout时钟的基准。一般情况下直接选择默认的Sys Tick(嘀嗒定时器)来维护SYS Timebase Source即可,即直接放在SysTick_Handler()中断服务函数中,也就是下面的HAL_IncTick()函数。
5、配置时钟
输入时钟频率(Input frequency)配置为24MHz外部高速频率(通过查看CT117E-M4产品手册中的电路原理图得出)
6、配置Project Manager
7、生成代码
8、配置keil5
a、安装芯片包(第一次打开keil5需要做此步骤)
b、调试器
三、点亮LED
PD2为高电平时,锁存器使能,数据从右端(1D~8D)传到左端(1Q~8Q);数据传输完后,就将PD2置0,数据不再传输过来,避免LCD对LED产生影响(LCD与LED有共用引脚) 。
因为LED左侧接VDD(高电平),所以右侧传过来低电平,形成电势差,LED就会点亮。此处设置PC8~PC15为输出高电平,让LED保持默认熄灭状态 。
在keil 5中的操作和上面一样
代码部分
所有代码必须写在BEGIN和END之间,比如说
如果重新用Cube MX生成代码,在BEGIN和END之外写的代码会全部消失。
下面代码的功能:第led个灯是mode状态(根据判断语句,mode为1是亮,mode为0是灭)
GPIO_PIN_8为0x0100, 即0000 0001 0000 0000
GPIO_PIN_9为0x0200, 即0000 0010 0000 0000
GPIO_PIN_10为0x0400,即0000 0100 0000 0000
由此可知,GPIO_PIN_8左移一位就是GPIO_PIN_9
<< 是左移运算符
0100 << 1 = 1000
0x0100 << 1 = 0x0200
led_show(1,1); //是将led1点亮,即将PC8清零
PC8就是LED1,0x0100 << (1-1),就是0x0100