STM32学习笔记_STM32F103ZET6
stm32f103zet6工作原理
stm32f103zet6工作原理
STM32F103ZET6是一款基于ARM Cortex-M3处理器的微控制器。
其工
作原理主要包括内核和IO口两部分。
内核是数据处理中心,类似于人的大脑,负责处理数据。
STM32F103ZET6的内核可以理解为单片机处理器中负责处理数据的电路。
IO口是输出、输入口,是双向的,既可作输入也可作输出。
STM32F103ZET6有144个引脚,其中有112个IO口,一般IO口都能耐
5V,即外部连接的外设输入5V电压不会对IO口有损害。
并且支持调试,SWD和JTAG调试。
此外,该微控制器还有复位电路和稳压模块等功能。
复位电路使电路从某一个确定的状态开始,如果电路工作在卡死等状态,可以使用复位功能来使电路恢复最初的状态(程序未跑起来的状态)。
稳压模块将供电电压VCC转
换为单片机工作电压VDD = 。
以上信息仅供参考,如需了解更多信息,建议查阅相关书籍或咨询专业人士。
STM32学习笔记-STM32F103ZET6
STM32F103 系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。
GPIO 输入输出,外部中断,定时器,串口。
理解了这四个外设,基本就入门了一款MCU。
时钟控制RCC:-4~16M 的外部高速晶振-内部8MHz 的高速RC 振荡器-内部40KHz低速RC 振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到- 外部低速32.768K 的晶振,主要做RTC 时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。
一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
存储器映像与寄存器映射:ARM 存储器映像4GB0X0000 00000X1FFF FFFF0X2000 00000X3FFF FFFF0X4000 00000X5FFF FFFF寄存器名称相对外设基地址的偏移值编号位表读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2 首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写//定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义APB2 总线基地址#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)//定义GPIOC 外设基地址#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)//定义寄存器基地址这里以GPIOC 为例#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)//控制GPIOC 第0 管脚输出一个低电平5)GPIOC_BSRR = (0x01<<(16+0));//控制GPIOC 第0 管脚输出一个高电平GPIOC_BSRR = (0x01<<0);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedef unsigned int uint32_t; /*无符号32 位变量*/typedef unsigned short int uint16_t; /*无符号16 位变量*//* GPIO 寄存器列表*/typedef struct{uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。
STM32F103ZET6通用定时器
STM32F103ZET6通⽤定时器1、通⽤定时器简介 通⽤定时器是由⼀个可编程预分频器驱动的16位⾃动装载计数器构成。
通⽤定时器可以应⽤于多种场合,如测量输⼊信号的脉冲长度(输⼊捕获)或者产⽣输出波形(输出⽐较和PWM)。
使⽤通⽤定时器的预分频器和RCC时钟控制器的预分频器,脉冲长度和输出波形周期可以在⼏个微秒到⼏个毫秒间调整。
STM32内有多个通⽤定时器,每个通⽤定时器都是完全独⽴的,没有互相共享任何资源。
通⽤定时器的主要功能包括: 16位向上、向下、向上/向下⾃动装载计数器。
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值。
4个独⽴通道可以实现4路:输⼊捕获、输出⽐较、PWM输出、单脉冲模式输出。
使⽤外部信号控制定时器和定时器互连的同步电路。
⽀持针对定位的增量(正交)编码器和霍尔传感器电路。
通⽤定时器框图如下:2、通⽤定时器的时基单元 通⽤定时器的时基单元主要由⼀个16位计数器和与其相关的⾃动装载寄存器。
这个计数器可以向上计数、向下计数或者向上向下双向计数。
通⽤定时器的计数器的时钟由预分频器分频得到,⾄于预分频器之前的时钟在时钟选择的时候回说到。
通⽤定时器的计数器、⾃动装载寄存器和预分频器寄存器可以由软件读写,在计数器运⾏时仍可以读写。
如下图红⾊框部分就是通⽤定时器的时基部分: 时基单元包含: CNT计数器(TIMx_CNT)。
PSC预分频器(TIMx_PSC)。
⾃动重装载寄存器(TIMx_ARR)。
CNT 计数器和⾃动重装载寄存器: TIMx_ARR寄存器是预先装载的,写或读TIMX_ARR寄存器将访问预装载寄存器。
通⽤定时器根据TIMx_CR1寄存器中的ARPE 位,来决定写⼊TIMx_ARR寄存器的值是⽴即⽣效还是要等到更新事件(溢出)后才⽣效。
在计数器运⾏的过程中,ARPE位的作⽤如下: 当ARPE = 0时,写⼊TIMx_ARR寄存器的值⽴即⽣效,即TIMx_CNT计数器的计数范围⽴马更新。
stm32f103zet6定时器详解及应用
stm32f103zet6定时器详解及应用
1、stm32f103zet6芯片及引脚图
2、stm32f103xx器件功能与配置
3、stm32f103zet6 定时器大容量的STM32F103XX增强型系列产品包含最多2个高级控制定时器、4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
下表比较了高级控制定时器、普通定时器和基本定时器的功能:
定时器功能比较
1)计数器三种计数模式
向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时
向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时
中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。
(此种技术方法也可叫向上/向下计数)
2)高级控制定时器(TIM1和TIM8)
两个高级控制定时器(TIM1和TIM8)可以被看成是分配到6个通的三三相PWM发生器,它具有带死区插入的互补PWM输出,还可以被当成完整的通用定时器。
四个独立的通道可以用于:
(1)输入捕获
(2)输出比较
(3)产生PWM(边缘或中心对齐模式)
(4)单脉冲输出
配置为16位标准定时器时,它与TIMX定时器具有相同的功能。
配置为16位PWM发生器时,它具有全调制能力(0~100%)。
在调试模式下,计数器可以被冻结,同时PWM输。
STM32F103ZET6(中文)介绍
− 2个16位带死区控制和紧急刹车,用于电机 控制的PWM高级控制定时器
− 2个看门狗定时器(独立的和窗口型的) − 系统时间定时器:24位自减型计数器 − 2个16位基本定时器用于驱动DAC
■ 多达13个通信接口 − 多达2个I2C接口(支持SMBus/PMBus) − 多达5个USART接口(支持ISO7816,LIN, IrDA接口和调制解调控制) − 多达3个SPI接口(18M位/秒),2个可复用为 I2S接口 − CAN接口(2.0B 主动) − USB 2.0全速接口 − SDIO接口
■ CRC计算单元,96位的芯片唯一代码
■ ECOPACK®封装
表1 器件列表
参考 STM32Байду номын сангаас103xC STM32F103xD STM32F103xE
基本型号
STM32F103RC 、 STM32F103VC 、 STM32F103ZC STM32F103RD 、 STM32F103VD 、 STM32F103ZD STM32F103RE 、 STM32F103ZE 、 STM32F103VE
本文档英文原文下载地址: /stonline/products/literature/ds/14611.pdf
参照2009年3月 STM32F103xCDE数据手册 英文第5版 (本译文仅供参考,如有翻译错误,请以英文原稿为准)
1/87
深圳市迪通科技有限公司 TEL:0755-83312947 83313941 83317488FAX:0755-83311568
深圳市迪通科技有限公司 TEL:0755-83312947 83313941 83317488FAX:0755-83311568
STM32F103xC, STM32F103xD, STM32F103xE数据手册
基于stm32f103zet6的IIC学习
K ing_BingGe的专栏写博客,只为记录学习过程中的点点滴滴。
交流Q851419062,我的进步离不开您的指点!!![置顶] 基于stm32f103zet6的IIC学习分类: stm32 2013-03-16 21:52 108人阅读 评论(0) 收藏举报STM32裸机IIC2402一、先简单了解下所为的IIC协议:IIC(Inter -Integrated Circuit) 总线是一种由PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。
它是由数据线 SDA 和时钟SCL 构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC 与IC之间进行双向传送,高速IIC 总线一般可达400kbps 以上。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC 在接收到8bit 数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。
CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
我用的是AT24C02的EEPROM,所以这个存储空间应该是256B的(2*1024b)1、明确我的器件地址因为24c02的器件地址高4位固定部分为1010,从图中可以看到A0/A1/A2都拉高,所以我的器件地址应该是1010111= 0x57,但是在操作2402的时候还需要发送方向位(读还是写),读:1,写:0,所以在进行操作的时候需要首先发一字节包含器件地址和方向位的数据最终组合起来就是0xae;2、发送完后释放SDA线并在SCL线上产生第9个时钟信号。
STM32F103ZET6核心板用户手册
STM32F103ZET6核心板用户手册本板特色:用一个USB口实现供电、下载、串口调试三个功能,所有I/O 口均用丝印标注,芯片USB口单独引出,大小仅9cm×6cm,是STM32学习开发者的利器!板载资源:接口说明:3.3V供电口:用于核心板给外部模块提供3.3V电源VCC供电口:用于核心板给外部模块提供VCC电源(即USB口接入的电源)USB接口:STM32F103ZET6芯片的USB接口,可用于芯片与上位机进行USB通讯,也可以用于给板子供电。
USB转232接口:通过转换芯片将STM32的UART1接口转换为USB接口,用于给板子供电,进行一键下载,同时具有USB转串口功能。
JTAG接口:用于板子的JTAG仿真和下载。
启动方式选择跳线:即BOOT0和BOOT1跳线,跳线接R12一侧为低,接R13一侧为高,使用一键下载功能时须将BOOT0和BOOT1都接低。
CR1220电池座(背面):用于安装CR1220型号的纽扣电池来给芯片的RTC供电。
一键下载功能使用说明:首先用USB线将板子的USB转232接口与电脑相连,第一次连接需要安装驱动程序。
驱动程序安装好后在设备管理器中可以看到设备名为Slicon Labs CP210x,打开mcuisp下载软件,进行如下设置,其中Port一栏就选刚才看到的Slicon Labs CP210x对应的端口号。
设置好后单击读器件信息,若成功则说明电脑与板子已正常连接。
选择要下载的程序文件,单击开始编程即可对将程序下载到板子中。
USB转串口功能使用说明:USB转232接口同时具有USB转串口功能,可以通过串口助手对板子进行调试。
首先用USB线将板子的USB转232接口与电脑相连,下载资料中提供的测试程序。
下载完成后,打开串口助手程序,单击串口配置,选择板子对应的端口进行配置。
配置完成后单击打开串口,正常情况下可以接收到板子发回的欢迎信息。
注意:某些串口助手在打开时会控制USB转串口芯片,导致板子无法使用复位按键进行硬复位。
STM32F103ZET6电路设计
STM32F103ZET6 电路设计题目:STM32F103ZET6 电路设计学院:电子信息与电气工程学院专业: ____________________________班级: _______________________________ 姓名: ______________________________ 学号: _______________________________一、设计背景随着信息时代的到来,电子技术正在突飞猛进的发展,电子产品已涉及到国防,航天等高技术领域,甚至生活的各个方面都要依靠电子技术,从使用环境来说,它的应用领域广泛,应用异彩纷呈,所以电子产品的设计也就变得格外重要,不管是最基础的电子产品还是高端的电子产品的设计,都需要设计者的精心设计。
科技水平的发展,ARM的应用越来越广泛,人与机器的交流也显得越来越重要,本次课程设计主要是以STM32F103RCT6为主芯片,其他辅助模块有JTAG 调试接口,RESET复位,系统时钟晶振,用户操作按键,LED状态显示,OLED液晶接口,ISP下载串口TTL,NRF2401无线通信接口,通用10 接口,FLASH-存储数据,USB供电-STM32 的USB_SLAVE接口等若干模块和其他辅助芯片为主要器件。
二、STM32F103最小系统的设计(1)原理图的绘制1) 创建工程在E盘建一个文件夹:STM32F103电路板设计选择[文件][新建][工程][PCB工程]STM32F103最小系统工程,保存到命名为STM32F103ZET6电路板设计文件夹中,在此工程下建一个原理图,命名为发STM32F103 ZET62) 放置元器件调用软件自带的库,寻找自己所需元器件。
Altium designer(Protel)中常用库:Ean ^a^rLar^r,■尸|>・rBurvii Lcvt-zth**!Miscella neous Devices .In tLib Dallas Microprocessor.ddb In tel Databooks.ddbProtel DOS Schematic Libraries.ddb PCB 元件常用库: Advpcb.ddb Gen eral IC.ddb Miscella neous.ddb3) 绘制原理图绘制原理图时,有些元器件软件自身并没有,这就需要自己来绘制 ,封装了在此模块中需要绘制 最终原理图为:Z ,hT 和KiwiriiKi wi : I***re 吨编译原理图,保证无错误,无警告把原理图绘制完之后可查看其网络报表及元件清单(2) PCB 的制作椁■■血 - ffiTS . ■砰和崗屮.・ JP i^:> Vi I Fi r hM-lftH. 1•ZtE*旧厂 ■ rffp HH>・■■ « ; I .^TMiX aiJEHiE■: i wa^r Qw♦J 口 沪S«e Mt £.1 nvicg 工・富 tt ・P>D XHTiO ■各 R fl! if* ® ・i»H 宜I«二辽■*■ _ 亠 _ -z ■*■—JM * I ~n~r:Ean ^a^rLar^r ,■尸 |>・ rBurvii Lcvt-zth**! (3) A .准备工作:保证原理图无错误, 对工程原理图编辑,有错误进行改正 可查看其分装管理Footprint Maragir- IFSTM32F103ZET 氐PIU 代f]91 呱 * &J W! TE*T 豈舸EW nr-C5C7 C1C C11 CIS C11 C14ID*Cap伽 KH C QP -10* 1D+他 W104- 1LUW ID* 1WW<1W- ID*血 ID*W-ID! 1D4 WGp 3 倔1{M 1D€L EM LEDCLEDQ LieC®5Cm&c:MCSC: o«w fffiC03C5C W5C QK5C 乂 J 亠M05C WCX NffiC «05C wra> MfiEC施垃M^C WBCMC5C :<l®>W5C03C3C*<90^0 '^SDCfl£50 O^DCI”抽於孰 ■.厲唤电晁名甘I -〜r —「叶 1 SwolScHDw 1鼻3鱼fg 1 5-Cffl "汨 g 1 乍 zmSzHfec1 5*i»1 ScHfe ;1 Scrta1 j -se:' Scrttoc 1 zrSdg11 AeeT gg I - Teel/ icrDoc1 电 k 1瓦停T_ 1 J&MsT&rg 11⑺灯-S-W 1 5^n _ WRw 1 g 「站g 1 ■i'W^crfe 1 S^SzHSoc 1 SMffl^SCfClOC 1 Star sg I '- -Kf^ ' ScMDoc1 5*«M I W&K 1 SU1 n -S L I-U JU 1 StrikeI :柚“幻叶1『j ■廿g I s™_ S C TD MJ 1 SteHSd^K i ySCT D K1 SnBfli ^cH)wIrac a 匸 KJI -I hsatKf *2 aojp Ir TiJl ConpcnertB fl. :el«7«dFoc>fEpiHit Manager - [STMSJFiO^ZET 氐PfUPCB]LEQM6DARMJLRG J1; I0■加 HD^25CKi H3.»c? HO^OO UR J4 UIA J4H 十T* HDf?x )US_CDWHDF1K3 IW42FUKHI2HMdCT H»2;C HndvrW第却TOM B L <«T5C Rul MIAL43 R M I 和 JtL^O * Hui AXKL-D.3A M I ZNSRail AKKL-Ql Hui OH 用站皿 些直山』 QR wMij REA>:RnJMlAUJ RW 护财J DR DR AXKLOiJ /灿」 DH AX»U>3Huin«iWtWL-0) Fl* 廂审朗 冃宀 叫L 帖 NEAXKL411 A»l 林相3禺*<|l MT I SchEc n Shrtll Stihtai 毋y 帥匚啦 %w(l 汩W G ^«dl ^chDnc I — " : >■> Sl?-wi I 吕机 a 労1rfH ■苗M Sheri I ~chP*g ShedlScrihDw Swll MOW 环gi SthC^fi-Mvc 环Xl jchEvc 钿—I 5<rhp«ir SWil SehUc Sfrwt i xh [粧 Stall 叶 兽i*l Sc hL«it ggM ^ttSl Seh&iC Sbwf • rchtnic ^>#dl jch&iE 种福1諭血 功g 汁皓i xh 血 Shflfll $G HP BE Siedl SdhOM 捕特i fchhcSwUSehDuI !chtwc Sh*J I 5cftEvc Sh 福i刊H W B•""!■悔 RJP 0 円* Efck^各元器封装正确就可生成PCB 了;2) 生成PCB选择[文件][新建][PCB ]命名为工程板,保存在之前建好的工程下面,最后选择[设计] Update PCB Document 工程板PcbDoc ,将其导入成功将数据导入,接下来接下来 PCB 的工程正式开PCB 的排版需要考虑多个因素,原理图的布局,布线,元器件的特性,板子的实用性,排版美观等等都需要我们考虑。
STM32F103ZET6时钟
STM32F103ZET6时钟1、STM32F103ZET6时钟说明 STM32F103ZET6的时钟树图如下所⽰: STM32F103ZET6有很多个时钟源,分别有: HSE:⾼速外部时钟信号。
HSI:⾼速内部部时钟信号。
LSI:低速内部时钟信号。
LSE:低速外部时钟信号。
HSI和LSI是芯⽚内置的时钟源,它们的频率⼤⼩是固定的,HSI是8MHZ,LSI是⼤约40KHZ。
时钟树中的序号1是⾼速外部时钟信号HSE: HSE是由有源晶振或⽆源晶振通过OSC_OUT和OSC_IN脚提供的,从图⽚中可以看到,HSE频率从4MHZ到16MHZ不等。
当使⽤有源晶振时,时钟从OSC_IN引脚进⼊,OSC_OUT引脚悬空;当使⽤⽆源晶振时,时钟从OSC_IN和OSC_OUT进⼊,并且要配谐振电容。
HSE最常使⽤的就是8MHZ的⽆源晶振。
时钟树中的序号D是外部低速时钟LSE: LSE是由有源晶振或⽆源晶振通过OSC32_OUT和OSC32_IN脚提供的。
LSE⼀般使⽤的是32.768KHZ的⽆源晶振。
时钟树中的序号2是选择PLL(倍频后的时钟)的时钟源: 从图中可以看出,PLL时钟的来源可以是HSE或HSI/2,通过PLLSRC(CFGR寄存器的bit16)来选择使⽤哪⼀个时钟源。
HSI是8MHZ的内部⾼速时钟信号,HSI会根据温度和环境的情况频率会有漂移,⼀般不作为PLL的时钟来源。
⼀般使⽤HSE作为PLL的时钟源。
时钟树中的序号3是设置PLL的倍频因⼦: 可以对PLL的时钟来源进⾏倍频,然后得到PLLCLK时钟源。
倍频因⼦可以通过时钟配置寄存器CFGR的bit21~bit18:PLLMUL[3:0]来配置,分别可配置成2、3、4、5、6、7、8、9、10、11、12、13、14、15、16倍频。
举个例⼦来说,如果选择HSE作为PLL的时钟源,⽽且HSE=8MHZ,且将PLL的倍频因⼦设置为9倍频,那么PLLCLK=9*8MHZ = 72MZH。
STM32F103ZET6(中文)(阅读笔记)
− 从256K至512K字节的闪存程序存储器 − 高达64K字节的SRAM − 带4个片选的静态存储器控制器。支持CF卡、
SRAM、PSRAM、NOR和NAND存储器 − 并行LCD接口,兼容8080/6800模式
■ 时钟、复位和电源管理
− 2.0~3.6伏供电和I/O引脚 − 上电/断电复位(POR/PDR)、可编程电压监测
器(PVD) − 4~16MHz晶体振荡器 − 内嵌经出厂调校的8MHz的RC振荡器 − 内嵌带校准的40kHz的RC振荡器 − 带校准功能的32kHz RTC振荡器
■ 低功耗
− 睡眠、停机和待机模式 − VBAT为RTC和后备寄存器供电 ■ 3个12位模数转换器,1μs转换时间M32F103xC STM32F103xD STM32F103xE
增强型,32位基于ARM核心的带512K字节闪存的微控制器 USB、CAN、11个定时器、3个ADC 、13个通信接口
功能
■ 内核:ARM 32位的Cortex™-M3 CPU − 最高72MHz工作频率,在存储器的0等待周 期访问时可达1.25DMips/MHz(Dhrystone 2.1) − 单周期乘法和硬件除法
■ 多达112个快速I/O端口
− 51/80/112个多功能双向的I/O口,所有I/O口 可以映像到16个外部中断;几乎所有端口均 可容忍5V信号
■ 多达11个定时器
− 多达4个16位定时器,每个定时器有多达4个 用于输入捕获/输出比较/PWM或脉冲计数的 通道和增量编码器输入
− 2个16位带死区控制和紧急刹车,用于电机 控制的PWM高级控制定时器
− 2个看门狗定时器(独立的和窗口型的) − 系统时间定时器:24位自减型计数器 − 2个16位基本定时器用于驱动DAC
STM32库函数编程、KeliMDK、stm32f103zet6
STM32库函数编程、KeliMDK、stm32f103zet6catalogue0. Cortex-M3地址空间1. 基于标准外设库的软件开发2. 基于固件库实现串⼝输出(发送)程序3. 红外接收实验4. 深⼊分析流⽔灯例程5. GPIO再举例之按键实验6. 串⼝通信(USART)7. 库函数开发通⽤流程⼩结8. DMA传输⽅式9. STM32 ADC10. SysTick(系统滴答定时器)11. STM32定时器0. Cortex-M3地址空间0x1: MDK中三种linker之间的区别1. 采⽤Target对话框中的RAM和ROM地址采⽤此⽅式,需在Linker选项卡中勾选Use Memory Layout from Target Dialog选项(选中这⼀项实际上是默认在Target中对Flash和RAM的地址配置,编译链接时会产⽣⼀个默认的脚本⽂件),并且在Target中设置好RAM、ROM地址。
MDK会根据Target选项中设定的RAM和ROM地址⾃动加载⽣成⼀个加载⽂件。
最后链接器会根据此⽂件中的信息对⽬标⽂件进⾏链接,⽣成axf镜像⽂件STM32是通过同⼀个连续的地址空间来寻址⽚上ROM和⽚外RAM2. 直接通过Linker选项卡中的R/O Base和R/W Base来设定链接信息接器最后可根据此处指定的地址信息进⾏链接,链接的⽂件应该是顺序存放了,最多RO和RW分开。
此时需要注意的是应将Use Memory Layout from Target Diaglog前的勾去掉,且保证Scatter File⼀栏中未包含分散加载⽂件,并且要在Misc controls中设定镜像⽂件的⼊⼝点3. 直接采⽤分散加载⽂件Relevant Link:/mybelief321/article/details/8947424/thread-17087-1-1.html1. 基于标准外设库的软件开发0x1: STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库(即操作⽚外固件的代码集合),是⼀个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
STM32单片机应用与全案例实践stm32自学笔记第二版pdf
STM32单⽚机应⽤与全案例实践stm32⾃学笔记第⼆版pdf STM32单⽚机应⽤与全案例实践pdfhttps:///s/16WrivuLcHvLTwS__Zcwl6Q4rj3stm32⾃学笔记第⼆版 pdfhttps:///share/init?surl=hsjGIXm6k5ustm32⾃学笔记第⼀版pdf/down1/stm32zxbj_downcc.zip/soft/317742.html第1章如何学习STM32 (1)1.1 学习STM32必须具备的知识基础(1)1.2 STM32的基本架构和基本原理(2)1.2.1 什么是ARM (2)1.2.2 什么是STM32 (3)1.2.3 STM32的内部结构(3)1.2.4 典型型号—STM32F103ZET6 (5)1.2.5 STM32的时钟树(5)1.3 学习STM32的最好⽅法是什么(9)1.4 学习STM32需要哪些⼯具或平台(9)1.4.1 硬件平台(10)1.4.2 软件平台(11)1.5 STM32程序开发的模式(12)1.5.1 基于寄存器的开发模式(13)1.5.2 基于ST固件库的开发模式(20)1.5.3 基于操作系统的开发模式(26)1.5.4 三种编程模式的选⽤建议(27)思考题(27)第2章如何调试STM32 (28)2.1 STM32单⽚机的最⼩系统(28)2.2 STM32⼯程模板的建⽴(30)2.2.1 STM32的固件库(Standard Peripherals Library)(30)2.2.2 新建⼯程模板第⼀步—拷贝固件库⽂件(34)2.2.3 新建⼯程模板第⼆步—新建⼀个KEIL⼯程(35)2.2.4 关于创建⼯程模板的简单⼩结(41)2.3 程序的烧写(42)2.3.1 基于串⼝的程序下载(烧写)⽅式(42)2.3.2 基于JTAG(SWD)的程序下载(烧写)⽅式(44)2.4 程序的调试(46)2.5 模板的使⽤(48)2.6 三个GPIO输出的范例—STM32中实现延时的三种常⽤⽅法(48)2.6.1 我的第⼀个LED⼯程—基于延时函数的延时(48)2.6.2 我的第⼆个LED⼯程—SysTick中断延时(50)2.6.3 我的第3个⼯程—定时器中断延时(52)2.7 GPIO⼝的各种输出⽅式及其应⽤(55)2.7.1 功能要求(55)2.7.2 程序实现(56)2.8 本章⼩结(58)思考题(59)第3章 GPIO及其应⽤—输⼊(60)3.1 单功能按键输⼊(60)3.1.1 实现思想(60)3.1.2 具体程序(61)3.2 复⽤功能按键输⼊(64)3.2.1 按键复⽤的基本概念(64)3.2.2 程序实现举例(64)3.3 ⾮按键类开关信号输⼊及其实现(67)3.3.1 GPIO的输⼊⽅式及其特点(67)3.3.2 程序实现(68)3.4 GPIO输⼊输出⼩结(69)思考题(70)第4章 TIMER与PWM (71)4.1 关于STM32的定时器概述(71)4.2 STM32定时器的简单应⽤(72)4.2.1 按周期输出⽅波的例⼦(72)4.2.2 实现原理(72)4.2.3 具体程序(72)4.3 STM32定时器的复杂应⽤—检测输⼊⽅波的频率(77)4.3.1 STM32定时器的其他特性(77)4.3.2 本例设计要求(78)4.3.3 硬件接⼝设计与测量原理(79)4.3.4 具体程序(79)4.4 PWM原理及其应⽤⼀—⼀个LED呼吸灯的实现(84)4.4.1 PWM的基本概念及其基本应⽤(84)4.4.2 STM32的PWM的实现原理(84)4.4.3 基于PWM的LED呼吸灯的实现思路(88)4.4.4 呼吸灯的实现程序(89)4.5 PWM原理及其应⽤⼆—通过L298N控制电机转速(96)4.5.1 硬件设计(96)4.5.2 直流电机调速与调向的原理(97)4.5.3 程序实现(97)思考题(104)第5章 USART及其应⽤(105)5.1 串⾏通信模块USART的基本应⽤要点(105)5.1.1 STM32的USART及其基本特性(105)5.1.2 STM32的USART应⽤的基本要领(106)5.2 ⼀个USART的通信实现(STM32与PC)—查询法(107)5.2.1 功能要求(107)5.2.2 实现难点(108)5.2.3 程序实现(108)5.2.4 USART应⽤的有关事项(114)5.3 ⼀个USART的通信实现(STM32与PC)—中断法(115)5.3.1 功能要求及通信协议设计(115)5.3.2 程序算法(115)5.3.3 本例的源程序(116)5.4 两个USART的通信实现(124)5.4.1 功能要求与通信协议(124)5.4.2 接⼝设计(124)5.4.3 程序实现(125)5.5 USART应⽤⼩结(139)思考题(141)第6章⼈机界⾯—按键输⼊与液晶显⽰(142)6.1 STM32与液晶模块12864的接⼝实现(142)6.1.1 STM32与液晶模块12864的接⼝实现—延时法(142)6.1.2 STM32与液晶模块12864的接⼝实现—查询“忙”状态(153)6.2 基于液晶模块12864的菜单实现(173)6.2.1 程序中菜单的种类与菜单化程序的优势(173)6.2.2 基于液晶模块12864的菜单实现实例(173)6.3 矩阵键盘的接⼝实现(186)6.3.1 矩阵键盘的应⽤与程序设计思想(186)6.3.2 4×4矩阵键盘的硬件设计(186)6.3.3 演⽰程序(187)6.4 本章⼩结(198)思考题(199)第7章同步串⾏接⼝总线SPI与I2C (200)7.1 STM32的SPI (200)7.1.1 SPI概述(200)7.1.2 STM32之SPI总线的应⽤要点(201)7.2 SPI的接⼝应⽤及其实现(202)7.2.1 STM32与OLED12864液晶模块的SPI接⼝(202)7.2.2 STM32的SPI1与OLED12864的接⼝程序(203)7.3 STM32的I2C总线(223)7.3.1 I2C总线的基本概念(223)7.3.2 STM32的I2C总线应⽤要领(226)7.4 STM32的I2C总线的应⽤举例(227)7.4.1 具有I2C接⼝的DS3231时钟模块(227)7.4.2 STM32与DS3231时钟模块的硬件接⼝(229)7.4.3 STM32与DS3231的软件接⼝及其演⽰实例(229)7.5 I2C总线稳健性设计(247)思考题(247)第8章 ADC、DAC与DMA及其应⽤(248)8.1 STM32的DMA (248)8.1.1 STM32的DMA及其基本特性(248)8.1.2 STM32的DMA原理及其配置要点(249)8.2 STM32的ADC (251)8.2.1 STM32的ADC的基本特性(251)8.2.2 STM32的ADC的程序流程与编程要点(253)8.3 ⼀个三通道A/D转换的范例(254)8.3.1 功能要求与⽅案设计(254)8.3.2 实现程序(256)8.3.3 本例的中断法实现(263)8.4 STM32的DAC (266)8.4.1 DAC概述(266)8.4.2 DAC的配置要领(266)8.4.3 DAC应⽤实例(268)思考题(277)第9章⼯程实例—基于线性CCD的⼩车循迹系统(278)9.1 系统要求(278)9.2 线性CCD的原理及其使⽤(278)9.2.1 线性CCD传感器原理(279)9.2.2 线性CCD传感器应⽤(280)9.2.3 硬件接⼝(281)9.3 ⾃适应曝光的算法设计(281)9.3.1 ⾃适应曝光算法(281)9.3.2 模块化架构(283)9.4 具体程序(285)9.4.1 ⼯程⽂件视图—⽂件结构(285)9.4.2 程序源代码(286)9.5 系统性能实测(315)9.5.1 系统实物与测试环境(315)9.5.2 系统实测结果(316)思考题(318)参考⽂献(319)。
STM32F103ZET6的中断管理
STM32F103ZET6的中断管理1、STM32的中断 STM32的中断管理是属于内核部分的,所以中断管理的寄存器也是属于内核组,不属于芯⽚外设,在查看相关资料的时候,需要查看相对应的内核⼿册。
STM32F103ZET6是Cortex-M3内核的IC。
Cortex-M3内核⽀持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
但是STM32并没有完全使⽤Cortex-M3内核的全部中断,只是⽤了其中的⼀部分。
在STM32中,有时候中断也称为异常、系统异常,把它们统⼀理解为中断就可以了。
2、中断编号 STM32不同类型的芯⽚IC所具有的中断个数是不⼀样的,在HAL库中,可以通过查找IRQn_Type这个结构体来查看该IC所具有的中断。
IRQn_Tyepe对该芯⽚的中断进⾏了编号。
STM32F103ZET6的IRQn_Type结构体定义在stm32f103xe.h头⽂件中,如下:typedef enum{ /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ HardFault_IRQn = -13, /*!< 3 Cortex-M3 Hard Fault Interrupt */ MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ /****** STM32 specific Interrupt Numbers *********************************************************/ WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ TAMPER_IRQn = 2, /*!< Tamper Interrupt */ RTC_IRQn = 3, /*!< RTC global Interrupt */ FLASH_IRQn = 4, /*!< FLASH global Interrupt */ RCC_IRQn = 5, /*!< RCC global Interrupt */ EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */ TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */ TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ USART1_IRQn = 37, /*!< USART1 global Interrupt */ USART2_IRQn = 38, /*!< USART2 global Interrupt */ USART3_IRQn = 39, /*!< USART3 global Interrupt */ EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ RTC_Alarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */ USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt */ TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt */ TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ FSMC_IRQn = 48, /*!< FSMC global Interrupt */ SDIO_IRQn = 49, /*!< SDIO global Interrupt */ TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ UART4_IRQn = 52, /*!< UART4 global Interrupt */ UART5_IRQn = 53, /*!< UART5 global Interrupt */ TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */} IRQn_Type;3、NVIC NVIC的简称是嵌套中断向量控制器,它控制着整个芯⽚中断相关的功能。
stm32f103zet6串行驱动12864
12864串行stm32f103zet6 战舰V3学习版在资料最下面有工程文件,直接烧录就可以使用。
希望大家尊重我的劳动成果,下载下来。
每个语句注释,在工程文件中都有。
12864相关驱动在key.c和Key.h中经我验证,可以用stm32引脚控制12864如上图为12864串口时序图串行数据传送共分三个字节完成:第一字节:串口控制—格式11111ABCA 为数据传送方向控制:H 表示数据从LCD 到MCU,L 表示数据从MCU 到LCDB 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令C 固定为0第二字节:(并行)8 位数据的高 4 位—格式DDDD0000第三字节:(并行)8 位数据的低 4 位—格式0000DDDD以上是说明书给的出的,个人理解从图上可以看出串行传输时需要用到CS,SCLK,SID三根信号线,但是由于CS是高电平有效,所以也可以把CS长接高电平,那样就只需要两根线就OK 了,当然当使用12864串行模式时,PSB引脚必须接低电平,复位RST引脚可以悬空不接,因为12864内部有上电复位电路。
所以电路图如下图所示一定要查资料,看下PSB引脚是否和VCC连接在一起,我在育松上买的QC12864 B,液晶屏幕,太垃圾了,资料上都没有说明串行该怎么修改,结果调试时候发现,PSB引脚电平不对,后来一查,PSB引脚和VCC连接在一起了,所以一定要确保引脚电平正确。
串行数据传送共分三个字节完成:——理解就是传输一个字节需要三个字节来确定。
第一个字节:11111ABC11111 000 单片机写控制指令给LCD11111 010 单片机写数据给LCD第二个字节:11110000第三个字节:00001111由于数据是传输是以一个字节8bits为单位,所以下面贴出传输一个字节的函数实现void Write_Bits(u8 bits){u8 i, Temp_Data;for(i=0;i<8;i++){Temp_Data=bits<<i;if((Temp_Data&0x80)==0){Reset_SID ;Reset_SCLK;Set_SCLK;}else{Set_SID;Reset_SCLK;Set_SCLK;}}}Temp_Data = W_bits<<i ;//把数据依次左移对于这个语句有点迷茫,知道是左移,有点疑惑,赶紧去百度,木有找到我心中的疑问,就去翻C语言书(一本好的C语言书是多重要,我用的是C Primer Plus),第500页,有这样一句话,该操作产生一个新的位置,但是不改变其运算对象。
STM32F103ZET6的基本定时器
STM32F103ZET6的基本定时器1、定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8。
STM32的定时器分为基本定时器、通⽤定时器和⾼等定时器。
TIM6、TIM7是基本定时器。
基本定时器是只能向上计数的16位定时器,基本定时器只能有定时的功能,没有外部IO⼝,所以没有捕获和⽐较通道。
TIM2、TIM3、TIM4、TIM5是通⽤定时器。
通⽤定时器是可以向上计数,也可以向下计数的16位定时器。
通⽤定时器可以定时、输出⽐较、输⼊捕捉,每个通⽤定时器具有4个外部IO⼝。
TIM1、TIM8是⾼等定时器。
⾼等定时器是是可以向上计数,也可以向下计数的16位定时器。
⾼等定时器可以定时、输出⽐较、输⼊捕捉、还可以输出三相电机互补信号,每个⾼等定时器有8个外部IO⼝。
定时器分类图如下:2、基本定时器 基本定时器没有外部IO⼝,所以它只有定时的功能。
基本定时器只能向上计数,也就是说基本定时器只能递增计数。
基本定时器功能框图如下: 从功能图的1中可以看到,基本定时器的时钟TIMxCLK来⾃内部时钟,该内部时钟为经过APB1预分频器分频后提供的。
基本定时器跟APB1总线时钟的关系如下:如果APB1预分频系数为1,则基本定时器的时钟等于APB1总线时钟。
如果APB1预分频系数不为1,则基本定时器的时钟等于APB1总线时钟经过分频后的2倍。
⽐如APB1总线经过2分频后的时钟为36MHZ,那么基本定时器的时钟就是72MHZ3(36*2)。
功能图中的2是⼀个预分频器,来⾃内部的时钟经过预分器分频后的时钟,⽤来驱动基本定时器的计数器计数。
基本定时器的预分频器是⼀个16位的预分频器,预分频器可以对定时器时钟进⾏1~65536之间的任何⼀个数进⾏分频。
计算⽅式如下: 定时器⼯作时钟 = 来⾃APB1的时钟/(预分频系数+1) 功能图中的3是⼀个16位的计数器,该计数器能能向上计数,最⼤计数值位65535。
stm32f103zet6 命名规则
stm32f103zet6 命名规则
STM32F103ZET6是一款由STMicroelectronics(意法半导体)生产的STM32系列微控制器。
关于STM32系列微控制器命名规则,可以按照以下方式解释:
1. STM32:这是STMicroelectronics的产品系列标识符,指代了该系列的微控制器产品。
2. F:表示该微控制器系列属于“Cortex-M3”内核架构,这是ARM处理器的一种。
3. 103:这是该系列微控制器的型号标识,用于区分不同型号和功能。
4. Z:表示该微控制器在同一型号系列中的不同封装/包装类型。
在STM32F103系列中,Z代表的是LQFP封装类型。
5. ET:表示该微控制器的速度等级和温度范围。
在STM32F103ZET6中,ET代表工业级(Industrial Grade)的速度等级和工作温度范围。
6. 6:表示该微控制器的ROM容量,单位是512KB(即6 x 128KB)。
该数字通常对应了微控制器的存储容量等级。
需要注意的是,以上规则是针对STM32F103ZET6这个特定型号的命名规则。
对于不同型号和系列的STM32微控制器,命名规则可能会有所不同。
因此,在选择和使用STM32微控制器时,建议参考STMicroelectronics官方的文档和规格表,以了解准确的型号命名和功能特性。
STM32F103ZET6串口通信
STM32F103ZET6串⼝通信1、电平标准 根据通讯使⽤的电平标准不同,串⼝通讯可分为TTL标准和RS-232标准,如下表: 从图中可以看到,TTL电平标准使⽤5V表⽰⾼电平,使⽤0V表⽰低电平。
在R232电平标准中,为了增加串⼝通讯的远距离传输及抗⼲扰能⼒,使⽤的是-15V表⽰⾼电平,使⽤+15V表⽰低电平。
如下图为RS232和TLL电平标准表⽰同⼀个信号时的对⽐。
在电⼦电路中,⼀般使⽤TTL电平进⾏通讯,⽽在PC机中则使⽤RS232电平进⾏通讯。
所以为了使电⼦设备可以和PC机进⾏串⼝通讯,必须对TTL电平和RS232电平的信号进⾏互相转换。
2、串⼝协议 串⼝通讯的英⽂全称为Serial Communication,这是⼀种在设备间⾮常常⽤的串⾏通讯⽅式。
串⼝通讯的协议,串⼝通讯的数据包由发送设备通过⾃⾝的TXD接⼝传输到接收设备的RXD接⼝。
在串⼝通讯的协议中,规定了数据包的内容,该内容由起始位、数据位、校验位以及停⽌位组成,通讯双⽅的数据包格式要约定⼀致才能正常收发数据。
格式如下图: 在数据帧格式中,校验位可以要也可以不要。
⼀般在串⼝通信中,空闲状态下,IO⼝的电平为⾼电平。
3、串⼝波特率 串⼝通讯⼀般使⽤的是异步通讯,异步通讯是没有时钟信号的,为了保证两个设备能够正常通讯,必须在两个设备间约定好收发的速率,波特率就是设备的收发速率,波特率表⽰的是单位时间内收发的bit位,即⼀个bit的收发时长。
⽐如波特率为9600的设备,那么该设备1S的时间内可以收发9600个bit,发送⼀个bit的时长位1/9600≈104us。
4、数据帧的起始信号和停⽌信号 串⼝通讯的⼀个数据包是从起始信号开始的,直到停⽌信号结束。
数据包的起始信号由⼀个逻辑0的数据位表⽰,⽽数据包的停⽌信号可由0.5、1、1.5或2个逻辑1的数据位表⽰。
有效数据: 在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定位5、6、7或8位。
基于stm32f103zet6之硬件SPI的学习
K ing_BingGe的专栏写博客,只为记录学习过程中的点点滴滴。
交流Q851419062,我的进步离不开您的指点[置顶] 基于stm32f103zet6之硬件SPI的学习分类: stm32 2013-04-03 19:44 87人阅读 评论(0) 收藏举报stm32硬件SPI有几天没有更新博客了,主要是因为这几天都在捣鼓彩屏和触摸屏,分别使用FSMC和模拟IO来实现功能,又因为这块屏有些问题,所以、就网购了一块屏,估计今天能到了,今天准备学习下硬件SPI,之前使用IO模拟SPI实现了对DS1302的访问,下一步准备学习SD卡的,在论坛里面查看了下资料,发现如果使用软件模拟SPI来进行SD的通信话,会极大降低对SD卡的读写速度,但是,如果使用SD模式或者说使用硬件SPI来访问SD卡,那么 速度会有很大的提升,其实我自己也没有证实,也只是根据前人的经验,所以现在准备证实一下,所以就像准备开始学习硬件SPI了,该来的还是来了。
一、所谓的stm32硬件SPI1、我们使用的SPI的主模式,主模式和从模式的区别在时钟SCK,详见参考手册!同样的stm32的硬SPI肯定也是要用到GPIO管脚复用功能的。
这就是映射和复用,当我们选择默认复用的时候就是PA4--PA7了,当我们选择了映射的时候,那么就是后面的GPIO了,我的最小系统是zET6的,所以GPIO是够用的,所以没有必要进行映射,那么就选择PA4 -- PA7了2、那么,不管初始化哪个内部外设,第一步就是使能GPIO和时钟了,这也不例外,首先看一段SPI的初始化的代码!void SPIx_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//选择了串行时钟的稳态:时钟悬空高SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设SPIx_ReadWriteByte(0xff);//启动传输}GPIO的配置那部分不需多说,重点来看看SPI的配置,其实我们对照着代码和参考手册来看一切就迎刃而解了,那么我们看看参考手册上面是怎么进行配置的吧相当明朗的,我想有了这个配置步骤,那解释都是多余的!其实硬件SPI也就是和FSMC差不多的,只要那个片选的控制线是需要我们软件控制的,对其它的几根数据线和时钟线,只要我们发出了写数据的命令,那么这些时序就是硬件自动完成的,打个比方说,我们发出如下命令SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据那么跟踪下去可以看到这个void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data){/* Check the parameters */assert_param(IS_SPI_ALL_PERIPH(SPIx));/* Write in the DR register the data to be sent */SPIx->DR = Data;}也就是说这里是把我们的数据赋值到DR寄存器中了的,只要她一接收到数据,OK,那接下来的传输过程就没有我们软件什么事情了,他会自动产生SPI的时序,把我们的数据传输到相应的寄存器中取,对于我来说,就是SD卡的寄存器中去,硬SPI其实也没有什么,接下来准备学习SD卡了。
STM32F103ZET6使用说明.
STM32F103ZET6最小系统板说明
下载说明
可以采用串口下载,JLINK仿真器下载或者ST-LINK下载
1、串口下载说明
串口下载器上面的TX接到板子PA10,RX接到PA9上面,两地之间连接,然后拨码开关BOOT0拨到下面(高电平,BOOT1拨到上面(低电平,然后按下复位键,此时STM32进入下载状态,然后点击电脑上面的下载软件进行下载,下载完毕后,拨码开关全部拨到上面,然后按下复位键程序运行。
2、仿真器下载说明
直接接到板子上面的仿真器接口进行下载和调试程序,此时拨码开关全部都是拨到上面。
3、 ST-LINK下载说明
下载上面的TMS端接到PA13,CLK接到PA14上面,两地之间连接,拨码开关全部拨到上面,然后点击电脑上面的软件下载,即可下载进去。
测试程序说明
1、按键测试
下载按键程序,按下KEY按键,D2指示灯会出现反相状态。
2、LED测试
下载完程序后,D1和D2两个LED都会点亮。
3、NAND FLASH测试
下载完程序后,D2指示灯点亮后,说明程序读写正常。
其他说明
板子上面的Vref+ AD基准电压管脚是单独引出的,可以根据自己的需要外接不同的电压,如果想选用板子上面的3.3V电压,只需要把板子后面V+两点用焊锡连着即可,不然测试到的AD电压将会是0V。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32F103 系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。
GPIO 输入输出,外部中断,定时器,串口。
理解了这四个外设,基本就入门了一款MCU。
时钟控制RCC:-4~16M 的外部高速晶振-内部8MHz 的高速RC 振荡器-内部40KHz低速RC 振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到- 外部低速32.768K 的晶振,主要做RTC 时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。
一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。
存储器映像与寄存器映射:ARM 存储器映像4GB0X0000 00000X1FFF FFFF0X2000 00000X3FFF FFFF0X4000 00000X5FFF FFFF寄存器说明:寄存器名称相对外设基地址的偏移值编号位表读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2 首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写//定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义APB2 总线基地址#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)//定义GPIOC 外设基地址#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)//定义寄存器基地址这里以GPIOC 为例#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)//控制GPIOC 第0 管脚输出一个低电平5)GPIOC_BSRR = (0x01<<(16+0));//控制GPIOC 第0 管脚输出一个高电平GPIOC_BSRR = (0x01<<0);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedef unsigned int uint32_t; /*无符号32 位变量*/typedef unsigned short int uint16_t; /*无符号16 位变量*//* GPIO 寄存器列表*/typedef struct{uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。
举例:将GPIOC0 输出低电平,具体代码如下:GPIO_TypeDef * GPIOx; //定义一个GPIO_TypeDef 型结构体指针GPIOx GPIOx = GPIOC_BASE; //把指针地址设置为宏GPIOC_BASE 地址GPIOx->BSRR =(1<<(16+0)); //通过指针访问并修改GPIOC_BSRR 寄存器为了操作更简便灵活,直接使用宏定义好GPIO_TypeDef 类型的指针,而且指针指向各个GPIO 端口的首地址,那么即可直接用该宏访问寄存器。
具体代码如下:#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)GPIOC->BSRR = (1<<(16+0));后面实验程序的编写,都是使用ST 公司提供的固件库,已经把STM32 所有外设封装好,只需要调用即可。
GPIO:GPIO引脚具有推挽和开漏两种输出模式,配置引脚输出模式使用GPIOx_CRL 和GPIOx_CRH寄存器。
推挽:输出高电平或低电平,一般选择此模式。
开漏:输出低电平或高阻态,若输出高电平,应外加上拉电阻,实现电平匹配;引脚具有线与关系,应用在I2C等总线通讯电路。
GPIO 工作模式通过GPIO 内部的结构关系,决定了GPIO 可以配置成以下几种模式。
(1)输入模式(模拟、上拉、下拉、浮空)在输入模式时,施密特触发器打开,输出被禁止。
可通过输入数据寄存器GPIOx_IDR 读取I/O 状态。
输入模式可以配置为模拟、上拉、下拉以及浮空模式。
上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。
浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。
模拟输入则用于ADC 采集。
(2)输出模式(推挽/开漏)在输出模式中,推挽模式时双MOS 管以推挽方式工作,输出数据寄存器GPIOx_ODR 可控制I/O 输出高低电平。
开漏模式时,只有N-MOS 管工作,输出数据寄存器可控制I/O 输出高阻态或低电平。
输出速度可配置,有2MHz\25MHz\50MHz 的选项。
此处的输出速度即I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。
在输出模式时,施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR 可读取I/O 的实际状态。
(3)复用功能(推挽/开漏)复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
(4)模拟输入输出(上下拉无影响)模拟输入输出模式中,双MOS 管结构被关闭,施密特触发器停用,上/下拉也被禁止。
其它外设通过模拟通道进行输入输出。
通过对GPIO 寄存器写入不同的参数,就可以改变GPIO 的应用模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F1xx 参考手册》中对应外设的寄存器说明。
在GPIO 外设中,通过设置“端口配置寄存器GPIOx_CRL 和GPIOx_CRH”可配置GPIO 的工作模式和输出速度。
CRH 控制端口的高八位,CRL 控制端口的低八位。
STM32固件库:ST 公司推出了一套固件库,内部已经将STM32 的全部外设寄存器的控制封装好,给用户提供一些API 函数,用户只需要学习如何使用这些API 函数即可。
什么是CMSIS 标准?CMSIS标准英文全称是Cortex MicroController Software Interface Standard,翻译为中文意思就是ARM Cortex 微控制器软件接口标准。
库文件之间的关系stm32f10x.h 、system_stm32f10x.h 和system_stm32f10x.c 文件存放在“\STM32最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”目录下,system_stm32f10x.h 是片上外设接入层系统头文件。
主要是申明设置系统及总线时钟相关的函数。
与其对应的源文件是system_stm32f10x.c。
这个文件里面有一个非常重要的SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。
stm32f10x.h是STM32F10x的头文件,类似于51 单片机的reg.51,在开发STM32F10x 程序的时候基本上都会调用这个头文件,可见其重要性。
此文件内部封装了STM32 的总线、内存和外设寄存器等,同时该文件还包含了一些时钟相关的定义和中断相关定义等。
stm32f10x_ppp.c 文件是STM32 外设的驱动源文件,比如stm32f10x_gpio.c 文件,里面已经封装好操作GPIO 外设底层的内容,提供给我们使用的是一些API函数。
stm32f10x_ppp.h 就是对应的头文件。
还有stm32f10x_rcc.c、misc.c和misc.h文件他们都是存放在“\STM32 最新固件库v3.5\Libraries\STM32F10x_StdPeriph_Driver”内。
Application.c 文件用于存放用户编写的应用程序,文件名可以根据个人爱好命名。
我们通常会命名为main.c,表示存放我们的主函数代码。
还要将STM32 的启动文件添加进来,否则系统不能启动。
需根据使用的STM32 芯片来选择,因为开发板上使用的是高容量的STM32F1芯片,所以选择startup_stm32f10x_hd.s。