【 STM32WB55 测评】_03_第一个程序
<div class='showpostmsg'> 本帖最后由 lvxinn2006 于 2019-5-7 13:42 编辑本次活动测评开发板STM32WB55 Nucleo Pack由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!https://www.stmcu.com.cn/Product/pro_detail/cat_code/STM32WB/family/81/sub_family/252/sub_child_family/0/layout/product
【实验目的】· 熟悉如何通过原理图分析电路原理;· 熟悉如何使用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 ——PB5LED2 ——PB0LED3 ——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。
设置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灯进行切换点亮。效果如下:
本实验比较简单,主要也是为了熟悉一下新单片机的寄存器,以及数据手册的使用。
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>老师您好 这块开发板最主要的功能是展示蓝牙无线功能的 这个测评未免不合时宜吧</p>
<p>存粹凑字数z换积分勿怪!!勿怪!!!!请勿怪!!!!千万勿怪!!!</p>
<p>存粹凑字数z换积分勿怪!!勿怪!!!!请勿怪!!!!千万勿怪!!!</p>
页:
[1]