为什么要学STM32单片机?答案就在这里

发布者:MysticMoon最新更新时间:2024-09-02 来源: elecfans关键字:STM32  单片机 手机看文章 扫描二维码
随时随地手机看文章

STM32是32位的单片机却只要八位单片机的价格,速度也是八位的好几倍。


更重要的是它作为ARM入门级的芯片比较容易掌握,网上资料也很多,很多人都在用。

STM32的IO端口有7个寄存器来控制,但是我们常用的就4个CRL CRH IDR ODR 。

端口配置低寄存器(GPIOx_CRL)

端口配置高寄存器(GPIOx_CRH)

端口输入数据寄存器(GPIOx_IDR)

端口输出数据寄存器(GPIOx_ODR)

其中CRL 控制高8位的 IO CRH 低8这两个实质是一样的。

对照我们AVR来看GPIOx_CRL就相当于DDRx ,GPIOx_ODR就相当于PORTx,GPIOx_ODR就相当于PINxSTM32的 IO 口可以由 口可以由 软件配置成 软件配置成 软件配置成 8种模式: 种模式:


为什么要学STM32?答案就在这里


1、输入浮空

2、输入上拉

3、输入下拉

4、模拟输入

5、开漏输出

6、推挽输出

7、推挽式复用功能

8、开漏复用功能

简单的来说STM32的CRL寄存器可以设置输入、输出模式,还可以设置输出的最大速率。

输入浮空 :既不是上拉也不是下拉输入。

开漏模式和推挽模式:弱上拉和下拉电阻被禁止,开漏模式时,读输入数据寄存器时可得到I/O口状态,推挽模式时,读输出数据寄存器时可得到最后一次写的值,模拟输入配置。弱上拉和下拉电阻被禁止读取输入数据寄存器时数值为’0’。

好接下来要说下一个常常听到的控制方法了,直接操作寄存器和库函数方法直接操作寄存器就是直接对CRL等寄存器写值。库函数是ST官方吧所有的控制都写好了,我们只需要调用。直接操作寄存器

GPIOA-CRH=0XFFFFFFF0;

GPIOA-CRH|=0X00000003;/PA8 推挽输出

GPIOA-ODR|=18; /PA8 输出高

库函数

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12 ;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;

GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;

GPIO_Init(GPIOA, GPIO_InitStruct);

GPIO_SetBits(GPIOA, GPIO_Pin_11 | GPIO_Pin_12 );

现在写一个LED的初始化

直接操作寄存器

/LED IO初始化

void LED_Init(void)

{

RCC-APB2ENR|=12; /使能PORTA时钟

GPIOA-CRH=0XFFFFFFF0; /PA8 推挽输出

GPIOA-CRH|=0X00000003;/速率

GPIOA-ODR|=18; /PA8 输出高 一开始高灭灯

}

注:先要使能PORTA时钟

库函数

void LED_Init(void)

{

GPIO_InitTypeDefGPIO_InitStructure; /声明结构体ST库

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/使能PA端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;/LED0--PA.8 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /速率

GPIO_Init(GPIOA, GPIO_InitStructure); /结构体初始化

GPIO_SetBits(GPIOA,GPIO_Pin_8);/PA.8 输出高

}

OK到这两种方法的初始化都OK了

main 函数

int main(void)

{

SystemInit(); /系统时钟初始化为72M SYSCLK_FREQ_72MHz

delay_init(72); /延时函数初始化

NVIC_Configuration(); /设置NVIC中断分组2:2位抢占优先级,2位响应优先级

LED_Init(); /LED端口初始化

while(1)

{

LED0=0;/也可以使用 (库)GPIO_ResetBits(GPIOA,GPIO_Pin_8);

/寄存器GPIOA-ODR=~(18);

delay_ms(300);

LED0=1; /也可以使用 GPIO_SetBits(GPIOA,GPIO_Pin_8);

/寄存器 GPIOA-ODR|=18;

delay_ms(300);

}

}

使能PORTA时钟,这里说明下STM32的时钟树和AVR51等有很大的区别,它每个外设都会有自己的时钟,要使用一个外设必须要先开外设的时钟。这样也一定程度上减少了功耗。


关键字:STM32  单片机 引用地址:为什么要学STM32单片机?答案就在这里

上一篇:STM32开发中的五大嵌入式系统
下一篇:STM32引脚中的BOOT1在哪里

推荐阅读最新更新时间:2024-11-12 13:35

51单片机-步进电机-舵机
1.文件 文件下载地址 https://download.csdn.net/download/weixin_43130546/12188429 2.电机分类 驱动类电机——如:四驱车马达 控制类电机 反应式步进电机——性能差,已被淘汰 永磁式步进电机——广泛用于消费产品 如: 28BYJ-48 (4相永磁式步进电机) 混合式步进电机——主要用于工业 3.电机工作模式 单四拍 双四拍 八拍 4.说明 P1_0-P1_4控制电机 按键上正转 按键下反转 按键1-9转相应的圈数 按键左反转90 案件右正转90 ESC暂停 5.代码 #include reg52.h sbit KEYOUT1 = P3^0; sbit
[单片机]
壹拾贰:单片机与芯片164的通信
本篇之后都是提高篇 1)只为学习,不讨论现实意义 2)与实物电路会有差距(以实物为准) 3)讲解范围:串行通信、数码管、1602、12864、点阵、直流电机、AD、DA等基础电路。 高级内容暂不讲(USB、CAN、DMA、Wifi、网络、真彩大液晶、触摸屏、GPS、GPRS、Zigbee、NandFlash、Camera等等)(ARM11上讨论这些) #基础知识 通信分为两种:并行通信和串行通信。 并行通信是将要所传送的数据的各位同时发送或接受,在该通信中,使用几条数据线,将数据分段同时进行传输,传输速度快,信息率高。 串行通信时使用很少的数据线,将要传送数据各个位按顺序一位一位地发送或接收,每一位都需要固定的时间长度,在串行通信
[单片机]
壹拾贰:<font color='red'>单片机</font>与芯片164的通信
单片机厂商及产品列举 2013-06-14
ARM 系列单片机 AVR系列(爱特梅尔公司) Atmel AT91 series (ARM 处理器等) AT90 series – AVR (Atmel 的高性能RISC 8位单片机,老产品) ATmega series – AVR (Atmel 的高性能RISC 8 位单片机,新产品) ATXmega series – AVR (Atmel 的高性能RISC 32 位单片机,新产品) Atmel AT89 series (Intel 8051/MCS51 架构8位单片机) MARC4 Cypress MicroSystems(赛普拉斯微系统公司) CY8C2xxxx (PSoC) 飞思
[单片机]
用C语言编程使51单片机的数码管左移循环显示
高手支招:请问用C语言编程使51单片机的数码管左移循环显示0-7的程序怎么编呀 由于我不懂得用中断和定时,请程序里不要用那两个函数,谢谢(*^__^*) 嘻嘻…… 悬赏分:0 - 解决时间:2010-7-31 18:09 问题补充:这个是我自己编的,可是运行起来就是不移动,麻烦你们帮修改一下,我没有编左移循环部分的程序。 //========================================================== 最佳答案: //--------------------------------------------------- #include REG51.H #define uint unsig
[单片机]
用C语言编程使51<font color='red'>单片机</font>的数码管左移循环显示
51单片机简单的按键(按下LED亮,松开LED灭)
#include reg52.h typedef unsigned char u8; typedef unsigned int u16; sbit l1=P2^3; sbit k1=P3^2; sbit l2=P2^2; sbit k2=P3^3; void delay(u16 i) { while(i--); } void anjian1() { if(k1==0)//判断按键是否被按下 { delay(1000);//消抖 if(k1==0)//消抖之后再次判断是否被按下 l1=~l1;//点亮led灯,led灯默认高电'平 while(!k1);//判断是否断开 } } void anjian
[单片机]
MCS-5l单片机片内部结构总框图
图1-2是MCS-5l单片机片内部结构的总框图,它可以划分为CPU、存贮器、并行口、串行口、定时器/计数器、中断逻辑几部分。 图1-2 MCS-51的内部结构框图
[单片机]
MCS-5l<font color='red'>单片机</font>片内部结构总框图
51单片机写LCD1602代码
#include at89x51.h #include stdio.h //------------- #define RW P1_0 #define RS P1_1 #define EN P1_2 #define BUS_LCD P2 #define BF P2_7 //---------------------------- void init(void); void init_lcd(void); void write_ins_lcd(unsigned char); void write_data_lcd(unsigned char,unsigned char); void ack_lcd(void)
[单片机]
STM32的CAN总线的基本原理及实现过程
1、什么是CAN CAN是Controller Area Network 的缩写(简称称CAN),是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后,CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。 CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消
[单片机]
<font color='red'>STM32</font>的CAN总线的基本原理及实现过程
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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