野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25776|回复: 3

学过51单片机的都进来看一下,STM32可以用类似51单片机的方法来编写

[复制链接]
发表于 2015-7-23 15:34:58 | 显示全部楼层 |阅读模式
本帖最后由 yawn 于 2015-7-23 16:02 编辑

学过51单片机的童鞋都知道,51单片机很容易实现读写IO口和端口,用sbit xxx=Px^x;就可以实现读写IO口,又或者PX=XXX;就可以写入端口,但STM32不是,想要读写IO口前必须在用之前初始化IO口,到真正用的时候还要调用一系列长长的英文字母的函数,也就是说必须要熟悉各种函数的用法才能编程,因为我是学习51单片机过来的,学习STM32的时候很不习惯调用函数库来读写IO口,经过我三天的学习,终于写了一段可以直接读写IO的方法而不再使用函数库的方法的程序(初始化IO口的时候还是要调用库函数),下面来看看我编写的用按钮控制LED亮灭的程序。
#include "stm32f10x.h"
#include "stm32f10x_convert.h"/****这是我自己编写的程序,里面的定义可以直接读写GPIO口***/
#include "bsp_led.h"
#include "bsp_key.h"

#define LED_OFF PB0_OFF/***用到了GPIOB口的0位(基于火哥的ISO开发板),宏定义LED_OFF,可以使LED灯熄灭,也就是置1***/
#define SB1 PA0_I/*****用到了GPIOA口的0位(基于火哥的ISO开发板),宏定义按钮SB1,相当于51单片机的sbit***/
#define LED_ON PB0_ON/***用到了GPIOB口的0位(基于火哥的ISO开发板),宏定义LED_ON,可以使LED灯点亮,也就是置0***/

void Delay(__IO uint32_t nCount);
int main(void)
{                        
                        LED_GPIO_Config();/***初始化LED灯要用到的GPIO口***/
                        Key_GPIO_Config();/***初始化按钮要用到的GPIO口***/
                        while(1)
                        {
                                uint8_t zt=0;
                                if(SB1 == 1)/***高电平触发,是不是很像51单片机呢***/
                                {
                                        zt++;
                                        if(zt)/***非零时执行***/
                                        {
                                             zt=0;
                                             LED_OFF;/***熄灭***/
                                             //PB_O=0XFFFF;/***直接用GPIO口赋值,和51单片机P0=0XFF;一样道理***/
                                        }
                                        else/***为零时执行***/
                                        {
                                             zt=1;
                                             LED_ON;***点亮***/
                                             //PB_O=0XFFFF;/***直接用GPIO口赋值,和51单片机P0=0XFF;一样道理***/
                                        }
                                        Delay(0x1fffff);
                                }                                   
                        }
}
void Delay(__IO uint32_t nCount)         //简单的延时函数
{
        while(nCount--);
}
看到这里,是不是很想知道stm32f10x_convert.h里面的程序呢,下面我就给大家展示我编写这个.H文件里的程序,当然,只展示有用到的程序,想要看或者用的话可以下载。

#define                 PB_O                  (GPIOB->ODR)                   /****写GPIOB口****/
#define                 PA_I                   (GPIOA->IDR)                  /****读GPIOA口****/
#define                 PA0_I                  (PA_I & GPIO_Pin_0)           /****读GPIOA0位****/
#define                 PB0_ON              (GPIOB->BRR = GPIO_Pin_0)          /****GPIOB0位置0****/
#define                 PB0_OFF            (GPIOB->BSRR = GPIO_Pin_0)        /****GPIOB0位置1****/

stm32f10x_convert.zip (3.21 KB, 下载次数: 25) https://www.firebbs.cn/forum.php?mod=attachment&aid=NjA4OHw0YWU1Yjk2OGJhOTdlYzgzZDM4MTA4MDcxOGM3ZGVlNnwxNzMyMzczMDUx&request=yes&_f=.zipattach://6088.ziphttps://www.firebbs.cn/forum.php?mod=attachment&aid=NjA4OHw0YWU1Yjk2OGJhOTdlYzgzZDM4MTA4MDcxOGM3ZGVlNnwxNzMyMzczMDUx&request=yes&_f=.zipattach://6088.ziphttps://www.firebbs.cn/forum.php?mod=attachment&aid=NjA4OHw0YWU1Yjk2OGJhOTdlYzgzZDM4MTA4MDcxOGM3ZGVlNnwxNzMyMzczMDUx&request=yes&_f=.zipattach://6088.ziphttps://www.firebbs.cn/forum.php?mod=attachment&aid=NjA4OHw0YWU1Yjk2OGJhOTdlYzgzZDM4MTA4MDcxOGM3ZGVlNnwxNzMyMzczMDUx&request=yes&_f=.zip

对于喜欢用51单片机直接读写IO的童鞋可以下载stm32f10x_convert.zip,里面包含了GPIOA到GPIOG的转换程序,想用哪个用哪个,前提是要先初始化GPIO口,不用谢哥










回复

使用道具 举报

发表于 2015-7-23 16:06:30 | 显示全部楼层
不错,学习一个
回复 支持 反对

使用道具 举报

发表于 2015-7-23 16:18:58 | 显示全部楼层
不错不错

控制STM32 IO 口的输出可以直接控制下面三个寄存器来实现输出

1、ODR (Output data register)
往这个寄存器里面写数据的话控制的是整个端口,
如:GPIOA->ODR = 0xFFFF; 就是控制整个PB口输出1.
这种方法就类似51单片机中的直接控制PA口,代码上就是 PA = 0XFF;

2、BRR(Bit reset register)或者BSRR(Bit set reset register)
这两个寄存器就可以单独的控制端口的某一位,跟51里面的位寻找是一样的。
如:GPIO->BRR = 0X01;,就是对PA0输出0,跟51里面的PA^0 = 0 ;的效果是一样的

其实你这种方法就是操作寄存器,操作IO的数据输出寄存器。比起51全部操作寄存器的方法来说,这也还是很接近库函数的方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-23 16:45:19 | 显示全部楼层
fire 发表于 2015-7-23 16:18
不错不错

控制STM32 IO 口的输出可以直接控制下面三个寄存器来实现输出

习惯了51单片机直接操作IO数据输出,STM32库函数对于学过51单片机的人来说很陌生,不知道哪个函数有什么作用的话很难上手,而用了我这个转换宏定义就能使学过51单片机的童鞋快速上手,见名知意,比如PA_I就是读取GPIOA口的数据,PA_O=0就是写入数据,只是写入和读取分开了而已,其它的基本和51一样了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 22:44 , Processed in 0.043922 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表