本帖最后由 lvxinn2006 于 2019-5-7 13:42 编辑
【实验目的】
· 熟悉如何通过原理图分析电路原理;
· 熟悉如何使用MCU的用户参考手册;
· 通过本实验掌握 GPIO 输出功能的使用方法;
· 初步熟悉单片机寄存器的配置方法;
· 用最少的代码点亮LED灯。
【实验环境】
· NUCLEO-WB55 Nucleo Pack开发板
· Keil MDK-ARM(Keil uVision 5.25.2.0)
· Keil.STM32WBxx_DFP.1.0.0.pack
【实验资料】
· NUCLEO-WB55 Nucleo Pack开发板原理图
· STM32WB55xx Data Sheets
· STM32WB55xx Reference manual(参考手册)
【实验分析】
硬件分析根据本人的习惯,拿到手的开发板,一般都先从底层硬件开始了解,新的单片机,也是从数据手册和参考手册入手,可能很多人更喜欢直接使用STM32CubeMX,也是个人习惯问题,更喜欢离单片机更近一些。
这次测评,我也尽量在后期测评中使用Cube,减少底层原理的分析,毕竟人们已经不太喜欢太多原理性的东西,还是简单为好,而且蓝牙BLE5.0协议栈部分,直接使用Cube将会大大减少工作量。
所有开发板功能的使用,首先都离不开原理图,先要得到开发板的原理图,点击如下地址,可以进入原理图下载页面
打开如下:
在页面中有两种板号的原理图,这两个分别是Nucleo板和USB Dongle板,检查我们手里的开发板,找到对应的板号:
在开发板的背面,可以看到,我手里的Nucleo开发板板号为MB1355,所以下载对应的文件:
下载后将文件解压出来:
可以看到,官方提供的硬件资源很全,原理图、PCB都给提供了,这点还是要给ST点赞的。
这套硬件资料是使用AltiumDesigner设计的,所以需要使用该软件打开,直接打开MB1355C.PrjPcb工程文件即可。
在打开工程文件的时候会提示很多依赖的PCB库不存在,基本可以无视,不影响我们使用原理图。
这里不对原理图进行分析,我们今天的目的是控制LED灯,直入正题,直接打开MCU.SchDoc:
这张图中包含了三个LED灯的原理图,直接看图,三个LED灯连接如下:
LED1 ——PB5
LED2 ——PB0
LED3 ——PB1
根据原理图,可以分析三个灯的开启条件:引脚高电平,点亮LED;引脚低电平,熄灭LED。
查询芯片参考手册根据单片机的使用常识,在接触到一个新的单片机时,最先看的一定是参考手册(STM32WB55xx Reference manual)的前2~3章,这些章节有助于让我们从整体架构上对单片机有个了解。
这里跳过第一章的介绍,直接找功能框图,但是发现在参考手册里并没有找到这个框图,根据ST的习惯,一般都把功能框图放在数据手册里,查看数据手册(STM32WB55xx Data Sheets):
这里很清晰的看到整个芯片内部的组成架构,从这个图中可以清晰的看到,有两个MCU核心,Cortex-M0+和Cortex-M4,而且每个核心分别有一个属于自己的AHB Lite总线,M4核心控制了大部分外设,M0+只控制了无线IP部分,这也是M0+的使命所在,主要用来处理协议栈部分的程序。
可以看到GPIO的功能部分,是被M4核心独占的,M4核心才是本单片机的主CPU,我们写的程序默认也是又M4核心运行的。
了解完功能框图,接下来了解下时钟树,因为所有单片机的外设都是需要时钟进行工作的,所以单片机的时钟系统,是我们第二个需要知道的,时钟树在参考手册(STM32WB55xx Reference manual)的207页,如下图所示:
时钟系统在单片机中是一个比较复杂的系统,配置的寄存器也比较多,对于单片机新人,不建议自己配置时钟,可以借助STM32CubeMX工具进行配置。
本章不需要对时钟进行配置,使用系统默认的时钟配置。查看了RCC的相关配置,初始的系统工作时钟是4MHz,这不影响点LED灯。
配置GPIOB时钟
需要设置AHB2ENR的[1]位为1。
设置GPIOB需要设置相应的位置,设置为01,即可设置引脚为输出模式。
通过写ODR寄存器,为引脚设置高低电平。
【实验代码】
新建项目
编写代码
代码清单如下:
- #include "stm32wbxx.h" // Device header
- enum{
- LED1=5,
- LED2=0,
- LED3=1,
- };
- #define MODIFY(reg,mask,value) MODIFY_REG((reg),(mask), (value)<<mask##_Pos)
- #define LED_ON(x) SET_BIT(GPIOB->ODR, 1<<x)
- #define LED_OFF(x) CLEAR_BIT(GPIOB->ODR, 1<<x)
- void SysTick_Handler(void)
- {
- static int led = LED1;
- switch (led){
- case LED1:
- LED_ON(LED1);
- LED_OFF(LED2);
- LED_OFF(LED3);
- led = LED2;
- break;
- case LED2:
- LED_OFF(LED1);
- LED_ON(LED2);
- LED_OFF(LED3);
- led = LED3;
- break;
- case LED3:
- LED_OFF(LED1);
- LED_OFF(LED2);
- LED_ON(LED3);
- led = LED1;
- break;
- }
- }
- int main(void)
- {
- SET_BIT(RCC->AHB2ENR, (1<<1)); //使能GPIOB时钟
- MODIFY(GPIOB->MODER, GPIO_MODER_MODE0, 0x1); //设置PB0为输出模式
- MODIFY(GPIOB->MODER, GPIO_MODER_MODE1, 0x1); //设置PB1为输出模式
- MODIFY(GPIOB->MODER, GPIO_MODER_MODE5, 0x1); //设置PB5为输出模式
-
- SysTick_Config(SystemCoreClock); //节拍定时器1s周期
- while (1){
- }
- }
复制代码
编译代码:
设置调试器
烧写代码
按开发板上的Reset键复位开发板,运行程序。
【实验现象】
· 复位开发板以后,可以看到三个LED轮流点亮、熄灭,这也是所有单片机的最基础的流水灯实验
· 本例使用了Systick定时器,在定时器中对LED灯进行切换点亮。
效果如下:
本实验比较简单,主要也是为了熟悉一下新单片机的寄存器,以及数据手册的使用。