STM32F4寄存器编写跑马灯例程
最近由于在学习STM32看到别人用寄存器编程控制跑马灯,于是自己也想试一试。可是试了好久终究弄不出来。回头看了下库函数的调用关系才搞明白。首先通过查看GPIOA的设置函数发现设置如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; /* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd)); /* ------------------------- Configure the port pins ---------------- */
/*-- GPIO Mode Configuration --*/
for (pinpos = 0x00; pinpos < 0x10; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; if (currentpin == pos)
{
GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * ));
GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * )); if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
{
/* Check Speed mode parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); /* Speed mode configuration */
GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * ));
GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * )); /* Check Output mode parameters */
assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType)); /* Output mode configuration*/
GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ;
GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
} /* Pull-up Pull down resistor configuration*/
GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * ));
GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * ));
}
}
}
GPIO_TypeDef端口设置结构体如下:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */
__IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
} GPIO_TypeDef;
改机构体根据结构体成员函数的大小自己形成了针对首地址的偏移量。从而与需要操作的寄存器地址偏移一一对应。通过查看设置函数可以看出,初始设置需要进行几步必要的设置,经过实验发现只需要设置
GPIOx->MODER和时钟就可以。同时需要对GPIO 端口置位/复位寄存器进行操作。由该寄存器可以知,低16位置位1,高16位复位0。由此得出寄存器操作代码如下:
//#define GPIPA *(volatile unsigned long *)0x40020000;
#define GPIOA_MODER *(volatile unsigned long *)0x40020000
#define GPIOA_OSPEEDR *(volatile unsigned long *)0x40020008
#define GPIOA_OTYPER *(volatile unsigned long *)0x40020004
#define GPIOA_PUPDR *(volatile unsigned long *)0x4002000C
#define RCC_AHB1ENR *(volatile unsigned long *)0x40023830
#define GPIOA_BSRR *(volatile unsigned long *)0x40020018
//typedef struct //{
// __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
// __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
// __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
// __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
// __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
// __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
// __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */
// __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */
// __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
// __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */
//} GPIO_TypeDef;
void delay_ms(int time)
{
int i=*time;
while(i--);
} int main(void)
{
// delay_init(168);
int i = , j = , k = ; RCC_AHB1ENR |= 0x00000001;
GPIOA_MODER &= ~((<<(*))|(<<(*)));
GPIOA_MODER |= (<< (*))|(<<(*));
GPIOA_BSRR &= 0x0; //clear
/* Speed mode configuration */
// GPIOA_OSPEEDR &= ~((3<<(6*2))|(3<<(7*2)));
// GPIOA_OSPEEDR |= (3 << (6 * 2))|(3 << (7 * 2)); /* Output mode configuration*/
// GPIOA_OTYPER &= ~((3<<6)|(3<<7)) ;
// GPIOA_OTYPER |= (0 << 6)|(0 << 7); /* Pull-up Pull down resistor configuration*/
// GPIOA_PUPDR &= ~((3<<(6*2))|(3<<(7*2)));
// GPIOA_PUPDR |= (1<< (6*2))|(1<<(7*2));
// GPIOA_BSRRL = 0x0040|0x0080; while()
{ GPIOA_BSRR = (0x0040|0x0080)<<; //reset
delay_ms();
GPIOA_BSRR = 0x0040|0x0080; //set
delay_ms(); }
} void SystemInit()
{
;
}
以上代码便可以实现流水灯例子。
STM32F4寄存器编写跑马灯例程的更多相关文章
- STM32F407 跑马灯 寄存器版 个人笔记
更多原理请参考跑马灯 库函数版 个人笔记 步骤 使能IO口时钟.配置相关寄存器寄存器RCC->AHB1ENR 初始化IO口模式.配置四个配置寄存器 GPIOx_MODER/ GPIOx_OTYP ...
- 【STM32H7教程】第18章 STM32H7的GPIO应用之跑马灯
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第18章 STM32H7的GPIO应用之跑马灯 本 ...
- android中实现跑马灯效果以及AutoCompleteTestView与MultiAutoCompleteTextView的学习
跑马灯效果 1.用过属性的方式实现跑马灯效果 属性: android:singleLine="true" 这个属性是设置TextView文本中文字 ...
- JavaScript “跑马灯”抽奖活动代码解析与优化(二)
既然是要编写插件.那么叫做"插件"的东西肯定是具有的某些特征能够满足我们平时开发的需求或者是提高我们的开发效率.那么叫做插件的东西应该具有哪些基本特征呢?让我们来总结一下: 1.J ...
- JavaScript “跑马灯”抽奖活动代码解析与优化(一)
最近的项目中做了一个"跑马灯"的抽奖特效插件.上篇文章已经分享过html和css 的相关知识.这篇文章主要分享一些 JavaScript 相关的知识.这几天在写这篇文章的时候,也顺 ...
- Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想
在淘宝App的首页中间位置,有一块小小的地方在不知疲倦地循坏滚动着头条标题(见下图的红框区域),这样的设计无疑能够在有限的手机屏幕上展示更丰富的内容.而实现这一功能需要用到的控件就是我在上一篇文章中提 ...
- TextView标签的属性和跑马灯效果
text:显示的内容 textSize:文本的大小 textColor:文本的颜色 visibility:可见性 默认可见,invisible:表示不可见,但对控件的显示区域做了保留 gone:隐藏 ...
- GPIO原理与配置(跑马灯,蜂鸣器,按键)
一.STM32 GPIO固件库函数配置方法 1. 根据需要在项目中删掉一些不用的固件库文件,保留有用的固件库文件 2. 在stm32f10x_conf.h中注释掉这些不用的头文件 3. STM32的I ...
- jq跑马灯效果
这几天公司产品有个无缝循环滚动的广告跑马灯要做,最开始想到的是<marquee>标签,但在PC端正常,在安卓广告屏上却怎么都跑不动,后来用的css3的animation,结果也是PC端及其 ...
随机推荐
- Windows环境下使用Nginx搭建负载均衡
前言 最近没有什么事情,喜欢总结并学习东西!前几天写来一个Session共享,那么我们为什么需要Session共享?因为我们的应用程序分布在多个服务器上,为了合理分配用户的请求,就需要用到负载均衡技术 ...
- Python入门学习网址
Python入门学习网址:http://www.runoob.com/python/python-install.html
- 利用 Xunsearch 搭建搜索引擎、内容搜索实战
Xunsearch 是开源免费.高性能.多功能,简单易用的专业全文检索技术方案,是目前非常知名的开源搜索引擎. 安装完Xunserach,还需要安装PHP SDK,才能进行搜索. ----- 本人已在 ...
- 如何让4年前的电脑装win10开机跑进15秒
我是用我的电脑测试的.看看我电脑的配置 我的是windows10,机械硬盘. 在这里要说的是给电脑优化,让其开机更快.当然,因电脑配置而异,我的最快是11秒.标题可能有点夸张了,结果因电脑配置而异,高 ...
- 沉淀,再出发:AngularJS初探
沉淀,再出发:AngularJS初探 一.前言 知识的学习需要形成一个闭环,在这个闭环之内可以自圆其说,从而触类旁通,加以理想创造,从而产生灵感.关于前端的知识,我已经写得差不多了,但是还有一个知识点 ...
- 解决charles中文乱码(附代码)
1. 将下面的代码保存为一个*.xml的文件 <?xml version='1.0' encoding='UTF-8' ?> <?charles serialisation-vers ...
- ZooKeeper学习之路 (六)ZooKeeper API的简单使用(二)级联删除与创建
编程思维训练 1.级联查看某节点下所有节点及节点值 2.删除一个节点,不管有有没有任何子节点 3.级联创建任意节点 4.清空子节点 ZKTest.java public class ZKTest { ...
- PAT——1037. 在霍格沃茨找零钱
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...
- 【hdu 3177 Crixalis's Equipment】 题解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3177 \(describe\): 有一个山洞,山洞的容积最大为\(v\).现在你有\(n\)个物品,这 ...
- LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )
根据 上一篇 文章 , ETH DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析 我们找到了 数据 的 ...