本文目的是主要介绍通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,实现流水灯,同时写出程序设计思路,用C语言寄存器方式编程实现。
运用 STM32最小系统核心板(STM32F103C8T6
)+面包板
+3只红绿蓝LED
,并搭建了电路,分别GPIOA-5
、GPIOB-9
、GPIOC-14
这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现。
※ 多根杜邦线、红绿黄LED灯、面包板、STM32F103C8T6、CH340 USB转TTL,ST-LINK
。
※ STM32F103C8T6
是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
● STM32代表STM32家族,32位MCU;
● F代表产品类型为基础型;
● 103代表特定功能为STM32基础型;
● C代表引脚数为48&49引脚;
● 8代表内存容量为64KB;
● T代表封装为QFP;
● 6代表温度范围为-40到+85℃。
内核 | Cortex-M3 |
---|---|
Flash | 64K x 8bit |
SRAM | 20K x 8bit |
GPIO | 37个GPIO,分别为PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1 |
ADC | 2个12bit ADC合计12路通道(外部通道:PA0到PA7+PB0到PB1,内部通道:) |
Timers | 4个16bit定时器/计数器,分别为TIM1、TIM2、TM4 TM1带死区插入,常用于产生PWM控制电机 |
通信串口 | 2IIC,2SPI,3USART,1CAN |
注意:建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv
● 任何外设都需要时钟,51单片机,STM32等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。
● 51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以使用,而在51中这个时钟是默认开启的,但是也存在一个问题,耗能大。
● STM32之所以是低功耗,因为它将所有的门都默认设置为disable,在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable,这样耗能就会减少。
● 根据数据手册可知,抚慰和时钟控制RCC(时钟控制)地址从0x4002 1000开始,根据外设偏移地址为0x18,可以确定APB2的地址为0x4002 1018,根据下图可得GPIOB的时钟使能控制位为第3位,因此将位3赋值为1,即开启GPIOB的时钟代码如下:
● 现代滤波是指用模拟电子电路对模拟信号进行滤波操作,其基本原理就是利用电路的频率特性实现对信号中频率成分的选择。滤波时,把信号看成由不同频率正弦波叠加而成的模拟信号,通过选择不同的频率成分来实现信号滤波。在计算机实际应用中,需要将模拟量转换为数字量(即进行A/D转换),为解决干扰问题,常用的方法主要有中值滤波
和均值滤波
。
● 现代滤波器的主要内容是从含有噪声的数据记录中估计出信号的某些特征或信号本身。一旦信号被估计出,那么利用它们的统计特征,如自相关函数、功率谱等,导出一套最佳的估值算法,所得到的估计信号的信噪比会比原信号更高。典型的现代滤波器是维纳滤波器。
对于常用的数字滤波器,一般分为IIR滤波器
和FIR滤波器
。
根据所学知识,简要设计一些点灯流程
● 首先要进行GPIO初始化(包括所用的引脚及时钟)——寄存器代码编写——仿真并用虚拟逻辑分析仪观察—— Hex文件烧录硬件实现
。
● 这是利用寄存器点流水灯的大致过程,先安装所需STM32F1系列支持包。
● 首先将S-TLINK插入电脑的一个端口。
● 打开设备管理器,检查S-TLIN驱动设备是否安装好。
可以看见,此图标没有带感叹号,所以已安装好。
● 建立LED文件,放在相应的目录下,文件名命名为light
。
● 本次点灯操作采用STM32F103C8T6芯片,所以选择芯片为STM32F103C8
。
环境搭建好后,进行编程。
● 首先在工程中添加.c文件,在Target1
-Source group1
,右键-Add New Item…
,在弹出的窗口中选中.c
文件,填写文件名保存,到此完成.c
文件的添加。
● 这里将.c
文件命名为led
文件。
● 再写入代码,注意项目结构,使用的引脚是GPIOA-5、GPIOB-9、GPIOC-14
这3个引脚上控制LED灯。
注:这里已经根据上述数据指南,成功找到三个引脚所代表的复位值。
#include "led.h"
//初始化PA5 PB9 PC14为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能 IOPA 时钟
RCC->APB2ENR|=1<<3; //使能 IOPB 时钟
RCC->APB2ENR|=1<<4; //使能 IOPC 时钟
// RCC->APB2ENR|=1<<5; //使能 IOPD 时钟
GPIOA->CRL&=0XFF0FFFFF;
GPIOA->CRL|=0X00300000;//PA.5 推挽输出
GPIOA->ODR|=1<<5; //PA.5 输出高
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000030;//PB.9 推挽输出 9属于端口配置高位寄存器
GPIOB->ODR|=1<<9; //PB.9 输出高
GPIOC->CRH&=0XF0FFFFFF;
GPIOC->CRH|=0X03000000;//PC.14 推挽输出
GPIOC->ODR|=1<<14; //PC.14 输出高
}
● .h
是C语言和C++语言的头文件。
● 一般在类的头文件里面只放入函数声明,宏定义,函数原型,而具体的实现在文件里面。
● 在编译的时候,编译器会自动加载和.h
匹配的.cpp
文件。
● 输入头文件函数相应的代码。
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED ¶Ë¿Ú¶¨Òå
#define LED0 PAout(5) // DS0
#define LED1 PBout(9) // DS1
#define LED2 PCout(14) // DS2
void LED_Init(void); //初始化
#endif
#include "sys.h"
#include "delay.h"
#include "ledhead.h"
#include "stm32f10x.h"
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=0;
LED2=1;
delay_ms(1000);
LED0=1;
LED1=1;
LED2=0;
delay_ms(1000);
}
}
● 此时我们的代码还不能运行,因为还没有将启动文件引入。
● 选择后缀名为md.s的文件。
● 此时发现还不行,还需要加入外设寄存器描述文件,还有两个system文件来配置时钟。
● 再将system的文件引入,主函数得以运行。
● 首先打开魔法棒,进行修改参数。
● 修改一下相应参数。
● 记得打开Keil自带的仿真模拟器。
● 点击Setup
进行修改相应参数。
● 点击运行
※ 最终实现如下
●将硬件进行搭建,为GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒,得到最终电路连接如下。
● FlyMcu仿真软件下载与安装,将压缩文件解压即可直接使用。
本文目的是主要介绍通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,实现流水灯,同时写出程序设计思路,用C语言寄存器方式编程实现,嵌入式开发本是博主短板,但功不唐去捐终入海。
寄语:好累
这次没有什么鸡汤了
只需好好休息便好!
[1]https://blog.csdn.net/houlile_sunny/article/details/127154537?spm=1001.2014.3001.5502
[2]https://blog.csdn.net/weixin_47554309/article/details/120810913