STM32F103+RT-Thread从零开始(一)——点亮LED

发布者:pcwg最新更新时间:2022-12-07 来源: zhihu关键字:STM32F103  RT-Thread  点亮LED 手机看文章 扫描二维码
随时随地手机看文章

STM32系列MCU

STM32系列芯片包括F0/F1/F2/F3/F4/F7/L0/L1/L4/H7等系列芯片芯片。不同系列的芯片适用于不同的应用场景。 F0/L0基于ARM Cortex-M0,F1/F2/L1系列基于ARM Cortex-M3,F3/F4/L4系列基于ARM Cortex-M4,F7/H7基于ARM Cortex-M7。L系列表示超低功耗,H表示超高性能(对应就是高功耗了),F就是个折中方案了,性能不错,功耗也不高。

其他的先不管,F1系列芯片主要分类如下:

· 超值型STM32F100 - 24 MHz CPU,具有电机控制和CEC功能· 基本型STM32F101 - 36 MHz CPU,具有高达1MB的Flash· 连接型STM32F102 – 48 MHz CPU具备USB FS device接口· 增强型STM32F103 - 72 MHz CPU,具有高达1MB的Flash、电机控制、USB和CAN· 互联型STM32F105/107 - 72 MHz CPU,具有以太网MAC、CAN和USB 2.0 OTGSTM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:

具体信息可查阅网站https://www.stmcu.com.cn/。

RTT操作系统

官网的简介:

RT-Thread是一款来自中国的开源嵌入式实时操作系统,由国内一些专业开发人员从2006年开始开发、维护,除了类似FreeRTOS和UCOS的实时操作系统内核外,也包括一系列应用组件和驱动框架,如TCP/IP协议栈,虚拟文件系统,POSIX接口,图形用户界面,FreeModbus主从协议栈,CAN框架,动态模块等,因为系统稳定,功能丰富的特性被广泛用于新能源,电网,风机等高可靠性行业和设备上,已经被验证是一款高可靠的实时操作系统。 RT-Thread实时操作系统遵循GPLv2+许可证,实时操作系统内核及所有开源组件可以免费在商业产品中使用,不需要公布应用源码,没有任何潜在商业风险。

RT-Thread操作系统源码风格与linux一致,在官方提供的源码中,包含有诸多芯片的工程示例,LPC系列和STM32F系列的很多。再者RT-Thread代码开源,又有那么详细的资料,如果遇到官方bsp下没有的芯片,对于动手能力强的同学,自己动手移植也比较方便。而且官方提供了详细的中文文档,对于英语不太好的同学简直就是一个福音。而且,RT-Thread提供了丰富的组件,使用者可以非常方便的实现诸如GUI、网络协议栈、Modbus甚至是SQLite数据库等功能。后续使用的时候再细细体会它的强大之处了。

寄存器Or利用固件库

嵌入式的编程,往下说就是操作MCU的寄存器。而固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。相对于固件库的方式,直接写寄存器的代码更为简洁,只需要对指定的寄存器进行需要的操作就可以了,但是对于STM32来说,寄存器多达数百个,记起来也是一件非常让人头疼的事情。ST推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一整套接口,你不需要去知道操作的是哪个寄存器,你只需要知道调用哪些函数即可。 关于写寄存器还是利用固件库去开发哪个好,一直都有争议,只能说存在即为合理,各有各的好处,我个人比较懒,不太喜欢去记那些寄存器都是啥。再者,我也不是专门搞STM32的,要是用写寄存器的方式开发的话,过一段时间不弄,再回来估计又得花些时间对着文档看了。所以在后续的博客,我也都会利用固件库开发。当然,用不用是一回事儿,根据官网技术文档,操作寄存器的方式是必须要会的。 个人建议,还是需要学会看硬件文档,看官方的技术资料,而不是遇到问题就百度。学会看官方的技术文档后,遇到问题解决起来将会事半功倍。

点亮LED

点亮LED,首先自然是安装Keil了。当然,使用其他工具也可以,对于我来说,我还是比较钟情于Keil。我现在使用的是Keil5,编译工具链为MDK-ARM v5.24。开发板为淘宝上找的便宜的不能再便宜的一块STM32C8T6开发板,引脚都要自己焊。下载线为ST-Link v2。根据淘宝商提供的硬件资料,这个板子PB12连接了一个LED灯,LED另外一端连接了上拉电阻,即LED在PB12低电平时点亮。



废话不说了,Keil的安装和破解,网上多的是,随便找个教程,走一走就完了。

第一步,创建工程

打开Keil后,首先需要创建个工程。点击project->New μVision Project。



填写工程名



选择芯片,如果没有你要的芯片,就需要到官网上去下载,然后安装。



选择需要用到的功能,Core、Startup和GPIO,可以看到下面有警告,GPIO依赖FrameWork和RCC,也要去勾选上就好了。



然后确定,工程就创建成功了。

第二步,增加main.c文件到工程中

点击如下按钮,创建一个新文件,并保存文件到工程目录中。



点击工程管理按钮,管理工程



点击Add Files 把main.c加入到Source Group 1下,Target 1和Source Group 1都可以修改,改成一个合适的名字。



第三部,编写main.c 文件

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#define CLOCK 72/8

//时钟配置,后续再详细捋时钟这块的东西,现在姑且按照这样设置这者


void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;

//将RCC寄存器设置为默认值

RCC_DeInit();

//打开外部高速时钟

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振起振

HSEStartUpStatus = RCC_WaitForHSEStartUp();


if(HSEStartUpStatus == SUCCESS){


//设置PLL时钟时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);


//设置AHB时钟


RCC_HCLKConfig(RCC_SYSCLK_Div1);


//设置APB1低速时钟


RCC_PCLK1Config(RCC_HCLK_Div2);


//设置APB2高速时钟


RCC_PCLK2Config(RCC_HCLK_Div1);

//使能PLL


RCC_PLLCmd(ENABLE);


//等待PLL工作


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}


//设置系统时钟为PLL时钟


RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


//等待系统时钟切换为PLL时钟


while(RCC_GetSYSCLKSource() != 0x08)

{

}

}


//打开需要使用的外设的时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |



RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);



RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

}

//延时微妙


void delay_us(unsigned int us)

{

u8 n;

while(us--)for(n=0;n}

int main(){


RCC_Configuration();


//设置GPIOB12 为推挽输出模式,速度为2MHz


GPIO_InitTypeDef gpioInit;


gpioInit.GPIO_Mode=GPIO_Mode_Out_PP;


gpioInit.GPIO_Pin=GPIO_Pin_12;


gpioInit.GPIO_Speed=GPIO_Speed_2MHz;


GPIO_Init(GPIOB,&gpioInit);

while(1){

//点亮LED


GPIO_ResetBits(GPIOB,GPIO_Pin_12);


//延时500ms


delay_us(500000);


//关闭LED


GPIO_SetBits(GPIOB,GPIO_Pin_12);


//延时500ms


delay_us(500000);

}

}

第四步,配置并编译烧写程序

点击build按钮,或者rebuild按钮进行编译



编译成功,Build Output输出如下:



无错误,然后可以进行程序烧写,烧写前需要设置Options for target。我使用的是ST-Link,所以需要选择ST-Link Debugger。然后点击后面的Setting按钮,进行其他设置。










设置完毕后点击download按钮,进行烧写即可。烧写时,让Boot0接低电平


关键字:STM32F103  RT-Thread  点亮LED 引用地址:STM32F103+RT-Thread从零开始(一)——点亮LED

上一篇:STM32F103+RT-Thread从零开始(二)——RTT系统中点亮LED
下一篇:STM32通用定时器的输入捕获(实例:输入捕获)

推荐阅读最新更新时间:2024-11-12 10:59

jz2440裸机开发与分析: 点亮LED灯之C语言2
编译 链接 取反汇编 arm-none-linux-gnueabi-gcc -g -nostdlib -c -o led.o led.c arm-none-linux-gnueabi-gcc -g -nostdlib -c -o start.o start.s arm-none-linux-gnueabi-ld -Ttext 0 -g start.o led.o -o led.elf arm-none-linux-gnueabi-objcopy -O binary -S led.elf led.bin arm-none-linux-gnueabi-objdump -D led.elf led.dis 反汇编源码分析(led.
[单片机]
jz2440裸机开发与分析: <font color='red'>点亮</font><font color='red'>LED</font>灯之C语言2
将STemWin移植到在STM32F103RCT6上的FreeRTOS上
1、版本信息 STM32固件库V3.5.0 FreeRTOS V8.2.3 STemWin 5.26 Keil 4 2、移植步骤 将FreeRTOS移植到STM32F103RCT6上,这个前面的博客有提到,课参考; 添加LCD屏的驱动代码,在这个实验中使用的正点原子的MINI板,使用的ILI9341的驱动芯片,添加好并在裸机下测试可用; 将STemWin 5.26相关文件添加到工程中,如下图 将涉及到的头文件路径加到工程的头文件路径中去 修改GUIConf.c文件中的一处地方,这个地方根据芯片来改,太大了编译会不通过,提示内存不足。如下图 在FreeRTOS创建一个任务来显示,效果如图 至此,就
[单片机]
将STemWin移植到在<font color='red'>STM32F103</font>RCT6上的FreeRTOS上
STM8自学笔记-002续 点亮LED
  点亮LED   点亮一个LED灯,应该是大多数单片机教程的第一步。这是最为基础的一步,也是最令人兴奋的一步,迈出这一小步就是迈入STM8大门的一大步。   通常,要对LED所在的单片机引脚(Pin)进行模式和电平设置,才能够点亮LED。先说C51和STM32上点亮LED的大致步骤,再来对比STM8上的步骤。   熟悉51单片机的童鞋应该很清楚,先用sbit映射一个Pin,然后让映射量置1来点亮该Pin连接的LED(拉电流驱动,与之相反的叫灌电流驱动)。也就是说,至少需要两行代码才能点亮LED。 sbit LED=P1^0; LED=1; //将P1.0口赋值 1,对外输出高电平   在STM32库函
[单片机]
STM32F103——DMA
DMA的基本介绍 DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输:在没有CPU的任何干预下,将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,CPU无时不刻的在处理着大量的事务,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?因此:转移数据(尤其是转移大量数据)我们可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由外设
[单片机]
<font color='red'>STM32F103</font>——DMA
STM32F103 - ADC采集电压
在使用STM32F103的ADC采集外部电压时,发现配置不同的采样周期ADC_SampleTime,外部输入阻抗的电压值不同,也就是影响了外部总电压分给ADC口的电压(电阻电压分配不对),但ADC能正常采集; 所以要根据STM32F103手册中的ADC采样周期与外部输入阻抗的关系表来确定软件设定的采样周期Ts和采样电阻RAIN大小。关系表如下所示:
[单片机]
<font color='red'>STM32F103</font> - ADC采集电压
stm32f103C8T6移植enc28j60+UIP1.0
移植环境(蓝色粗体字为特别注意内容) 1,开发板:STM32F103C8T6最小系统开发板。 2,开发环境:Keil uv5 3,参考文献:https://blog.csdn.net/wzs298/article/details/12228481 移植ENC28J60这个网络模块可谓是困难重重啊,。。。。。找了很多个例子都没有成功的,只能说很坑很坑,我不知道网上为什么那么多人抄袭,,没有经过自己验证就copy出来。。。。捣鼓了一天终于把这个坑爹的模块搞定了,,,, 先来贴一张图片: 本例程移植uIP-1.0协议栈,演示开发板和PC间的TCP通信。自定义了一个简单的应用层 通信协议。本例程实现的功能有: (1)通过
[单片机]
<font color='red'>stm32f103</font>C8T6移植enc28j60+UIP1.0
使用STM32、SFPGA和I.MX6ULL IO点亮LED
摘要:你点亮过多少板子的LED灯呢?有很多小伙伴要求讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多,口说无凭,今天就来点亮一下STM32、FPGA和Liunx板子的LED灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习! 一、使用STM32点亮LED灯 STM32从字面上来理解ST是意法半导体,M是Microelectronics的缩写,32 表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32 位控制器当中,STM32可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。首先使用STM32电亮一个led灯,
[单片机]
使用STM32、SFPGA和I.MX6ULL IO<font color='red'>点亮</font><font color='red'>LED</font>灯
stm32f103 RTC周期性待机唤醒(一)
做一个低功耗的东西,搞了好几天,程序一直卡在一个地方(见下图),今天终于发现问题出在哪里了,对待机唤醒的问题做一个总结(只针对我遇到的问题,其他部分网上都有,基于stm32f103) 1、解决我遇到的问题 我的RTC初始化部分有个“保存在备份寄存器的RTC标志是否已经被配置过的判断”,如果已经配置过,则进入else部分,但是这个else部分没有“要使能电源时钟,使能备份时钟,取消后备区的写保护”这些配置语句,而待机唤醒后程序从主函数执行,会执行到else部分,因为没有那些配置语句,所以再次对闹钟赋值就会不成功,就会卡在那里。(那些配置语句在clock_ini函数里,有注释) 2、待机用不用加extiline
[单片机]
<font color='red'>stm32f103</font> RTC周期性待机唤醒(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved