这几天被隔离管着无聊,就上淘宝买了一块《正点原子》 STM32F103 nano开发板,来练习 stm32f103 的程式。买这块开发板的原因是因为,板子已经有大部分MPU可以应用的线路包括 LED, 七节显示,IR, BUZZ, botton, 和 ST-link 等等基本需要的线路。还附上一个小塑料盒,嶲带方便,也不需要接太多的线。毕竟只是练习了解 F072 和 F103 的差别。
另外,F103的资源多,找资料方便。
下边我就把过程记录一下。(这里舍去去正点原子网站取资料的过程)

开发板

从淘宝下单后,收到的东西是这样,原有的内付程式是个24 小时的时钟。

跑马灯

内附的跑马灯程式是使用左上方那一排红色 LED, 线路是固定好的,所以要看看线路是用高电平还是低电平控制亮点的。


从上面两张线路图可以看到两件事

  1. LED 的上头是 VCC输入,所以,下边的控制必须是低电平(“0”)的时候,LED会被点亮。
  2. LED 是被 PC0~7 控制的,也就是 GPIOC 这一組 I/O port.

程式解析

把开发板的资料从《正点原子》的网站下载下来后,找到“程序源码”找到“寄存器”版的标准程式。(建议把中文的档名改成英文,避免MDK 不认识而无法载入)


再找到实验一 的程式

再找到 里面的 USER 档案夹 ,点击 MDK 的 Project 档,就可以载入 跑马灯的全部程式。

直接编译程式与执行

main.c 档长得大概像这样子
里面包含了两个 main(), 其中一个是被注解掉的。

#include "led.h"
#include "delay.h"
#include "sys.h"
//****************************************
//****************************************
/*int main(void)
{   Stm32_Clock_Init(9);    // 计时器是给 delay()用的delay_init(72);         //  LED_Init();  //按右键 用 goto xxxx 去看内容/* 以下的 Main()是给只有两个onboard LED 开发板用的。程式很简单,就是两个 LED 交互一明一暗,每隔 500 ms 的亮灯。想要知道 LED0 是谁控制,就按右键 goto difinition of ‘LED0',了解。*/while(1)  {  LED0=0;//LED0 LED1=1;//LED1 delay_ms(500);LED0=1;//LED0 LED1=0;//LED1 delay_ms(500);    }
}*/int main(void){  u8 LED=0x00;u8 i=0;Stm32_Clock_Init(9);   //delay_init(72);           //LED_Init();               //while(1){for(i=0;i<8;i++){LED++;  GPIOC->BRR = LED;delay_ms(200);LED<<=1;//}LED++;   GPIOC->BRR = LED;delay_ms(200);LED=0xff;//GPIOC->BSRR = LED;delay_ms(200);}}

第一个 main() 的 LEDx ,我们查询的结果是定义在 LED.h 这个档案里

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//
//
#define LED0 PCout(0)   // PC0
#define LED1 PCout(1)   // PC1
#define LED2 PCout(2)   // PC2
#define LED3 PCout(3)   // PC3
#define LED4 PCout(4)   // PC4
#define LED5 PCout(5)   // PC5
#define LED6 PCout(6)   // PC6
#define LED7 PCout(7)   // PC7void LED_Init(void);//#endif

PCout(1) 在 sys.h 档案里

BIT_ADDR(addr, bitnum) 也在 sys.h 档案里


这样就可以从 sys.h 档里看到许多 F103 的寄存器的address 定义 与使用了。

第二段 main()

程式如下:

 int main(void){ u8 LED=0x00;u8 i=0;Stm32_Clock_Init(9);   //delay_init(72);           //LED_Init();               //while(1){for(i=0;i<8;i++){LED++;  GPIOC->BRR = LED;delay_ms(200);LED<<=1;//}LED++;   GPIOC->BRR = LED;delay_ms(200);LED=0xff;//GPIOC->BSRR = LED;delay_ms(200);}}

我们只看 LED_Init(); 这个副程式,是在 LED.c 这个档案里,如下:

#include "led.h"
//
//
//LED IO3
void LED_Init(void)
{RCC->APB2ENR|=1<<4;    //       GPIOC->CRL&=0X00000000; GPIOC->CRL|=0X33333333;//PC0~7           GPIOC->ODR|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//PC.0~7
}

这张图是 GPIOC 的定义, 及 GPIO_TypeDef 这两个是被定义在 stm32f10x.h 这个档案里。我把相关的参数都找出来放在一起,抄录在下面。

//stm32f10x.h
/*!< Peripheral memory map */
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOC                ((GPIO_TypeDef *) GPIOC_BASE)/** * @brief General Purpose I/O*/typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;

由于 GPIOC 被指向一个结构叫 GPIO_TypeDef,这个时候 GPIOC->ODR 这一类的符号就容易看懂了。

第二段 main()里面的这一段是主要点灯的程式。

for(i=0;i<8;i++){LED++;  //点 bit 0 用的GPIOC->BRR = LED; /* 查资料,BRR 是’1‘的时候会把 ODR 输出重置为低电平’0‘。BRR 是’0‘的时候会,不影响当下的 ODR 内容。*/delay_ms(200);LED<<=1;//向前移动一个灯,原来的灯在等一下用 LED++ 补上}

而下面这一段程式是做收尾的工作:

     LED++;    //for 回圈出来后的收尾,与回圈里是一样的GPIOC->BRR = LED; //for 回圈出来后的收尾,与回圈里是一样的delay_ms(200);  //for 回圈出来后的收尾,与回圈里是一样的LED=0xff;//GPIOC->BSRR = LED; // 把 GPIOC 设成高电位,关闭 LEDdelay_ms(200);

所以整个跑马灯是从LED0 开始,逐个点亮之后,全部熄灭,让后再一个循环。
我这一篇文章主要是在分析 header 档的运用方法。因为,c 语言要容易移植到不同的 MPU/CPU, 比较耗时间的就是改写这些 header 档。当然,各家 芯片公司都会尽量准备好这些档案。

STM32F103RB 实作笔记(一)- GPIOC LED 跑马灯(正点原子 STM32F103 nano开发板)程式解析相关推荐

  1. STM32F103RB 实作笔记(六)- HC-05 蓝牙模组与手机 APP(正点原子 STM32F103 nano开发板)程式解析

    这一篇文章是为后面的实验做的一个准备工作 我们在做开发板扩展时,最不喜欢遇到的就是"不知道发生了什么事"!所以, 会用一些输出显示装备来告诉我们,现在已经在哪里了. 譬如,前一个实 ...

  2. STM32F103RB 实作笔记(九)- PWM + SPI +MAX6675 整合试验 (正点原子 STM32F103 nano开发板)程式解析

    个人工作上的关系,需要做一款温度控制风扇速度的控制器,还需要能够看到温度和PWM的值.于是我用这个不熟悉的 STM32F103 试试,顺便把 PWM 和 SPI 也了解一番. 一开始当然也是跌跌撞撞, ...

  3. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验

    一.首先我们来了解建立好的工程框架 1.USER 组USER下面主要存放的是用户代码. main.c是主函数 system_stm32f4xx.c文件是片上外设接入层系统文件,主要是申明设置系统及总线 ...

  4. FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019级电子科学与技术专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...

  5. STM32工作笔记001---认识开发板资源-以正点原子战舰版开发板为例

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里只把不太明白的写上. 1.DS18B20是湿度传感器 DS18B20是常用的数字温度传感器,其 ...

  6. HaaS学习笔记 | HaaS框架环境下基于MicroPython的LED跑马灯实现及比较

    [1]题目要求 [案例]:在HaaS框架下用原生MicroPython实现LED跑马灯.       蓝蜻蜓ESP32开发板的LED灯电路连接如下:          D3灯----GPIO14,高电 ...

  7. HaaS学习笔记 | 基于HaaS Python轻应用的LED跑马灯明细教程

    [1]题目要求     [案例]:在HaaS框架下实现LED跑马灯.       蓝蜻蜓ESP32开发板的LED灯电路连接如下:       D3灯----GPIO14,高电平点亮,低电平熄灭.   ...

  8. 定时器控制led跑马灯

    定时器控制led跑马灯 概述 1.1 资源概述 开发板:正点原子STM32F103zet6精英开发板 控芯片型号:STM32F103ZET6 开发板资料下载地址:http://www.openedv. ...

  9. (第16-17讲)STM32F4单片机,FreeRTOS中断管理简介【视频笔记、代码讲解】【正点原子】【原创】

    文章目录 视频笔记 实验现象 代码讲解(个人注释) 一个弹幕的问题? PendSV和Systick中断优先级最低? demo函数 定时器函数 视频笔记 老生常谈 老生常谈 老生常谈,FreeRTOS只 ...

最新文章

  1. python 错误 SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record mac (_ssl.c:1864) 解决方法
  2. win10开启wsl系统,让我们愉快的在windows上使用Linux
  3. kotlin sealed 中_Kotlin sealed class
  4. Python collection模块
  5. MyBatis复习(三):MyBatis核心对象SqlSessionFactory和SqlSession
  6. Kafka Partition Leader选举机制原理详解
  7. 如何证明人的记忆力是无限的
  8. 谷歌地图开放俄军事设施高分辨率卫星图
  9. mbedtls里面的rsa应用函数
  10. 关机一直显示正在关闭服务器,电脑关机后,显示正在关机,但等半天也关不了 怎么办...
  11. nuxt整合vue-pdf插件和使用createLoadingTask方法进行分页
  12. Chrome 改进 Enhanced Safe Browsing 功能,强化扩展程序和文件下载安全性
  13. 如何给图片加水印?这三个图片加水印方法,帮你添加花式水印
  14. 蜗牛—cocos2dx之初识
  15. 玩转X-CTR100 l STM32F4 l PS2无线手柄-4WD智能小车
  16. NDCG评价指标讲解
  17. 淘宝特价版正式改版!为搏杀下沉市场而来!
  18. 电脑耳机完全插进去声音听不清楚,插一半就是正常的?
  19. 软件测试-Stream IPHONE手机抓包
  20. 一行代码解决vue数据量大卡顿问题

热门文章

  1. 10_前端笔记-ViewUI
  2. 谋杀上班时间的30个小众网站
  3. CNopendata·PPP项目数据简介
  4. 一篇博文搞定申请技术专利流程
  5. Ucore------Lab1_Practice6
  6. Lending Club Data For Scorecard Development in SAS Enterpise Miner
  7. 微信新消息,任务栏一闪一闪问题处理
  8. php直播源码,生成验证码并提交验证
  9. 学计算机有什么好处200字,关于电脑的作文200字(通用10篇)
  10. java se与java ee的区别