STM32学习笔记

  • 此文用于记录学习STM32中所学习或者巩固的知识,主要围绕但并不局限于STM32。
  • 本次学习并非为了深入了解使用STM32,而是为了接触其它嵌入式芯片打基础,因此学习中偏重于寄存器操作方法的学习,库函数方法依情况而定。

GPIO

General-purpose I/Os


<h6>推挽输出与开漏输出</h6>

推挽输出(左)_开漏输出(右)
  • 推挽输出 (push-pull,TTL/CMOS反相器)

  • 输出驱动能力有限

  • 无法直接 “线与”

  • 开漏输出 (OC门,即集电极开路门)

  • 必须有上拉电阻,否则只能输出低电平

  • 驱动能力可由外接电源调节

  • 可以直接 “线与”

<h6>寄存器声明与定义</h6>

  • C语言在给结构体分配内存空间时,会给每个成员依次分配连续的地址空间,而GPIO的七个寄存器在内存映射中也被分配了连续的地址空间。所以只要在结构体内按照内存映射中分配的顺序声明成员,每个寄存器的地址就能够依次一一正确对应。
typedef struct
{
  __IO uint32_t CRL;//volatile unsigned int 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;

<h6>volatile的使用</h6>

  • 由于IO口的寄存器值随时可能会变化,每次使用时应重新读取,故加上volatile防止编译器对其进行优化。
  • 需要使用volatile的情况:
  • 变量的值随时可能会变化
  • 变量的值会受到其它共享此变量的寄存器的影响
  • 位带操作中,编译器并不知道同一个bit有另一个别名区可以影响该比特的值,所以要用volatile使每次都重新读值

<h6>上拉/下拉输入 & 浮空输入</h6>

  • 上拉/下拉输入表示IO口内部已经集成了上拉/下拉电阻,外部输入只需要提供上拉/下拉电压即可;USART的RX端采用的即是上拉/下拉输入模式。
  • 浮空输入则适合外部有提供上拉/下拉电阻的情况。例如作为按键检测输入端口使用。

时钟和复位 RCC

Reset & Clock Control


<h6>右移操作符</h6>

  • Eg:
while( ! (RCC->CR>>17) );//判断RCC_CR第17位是否为 1
  • RCC_CR是clock control register,第17位为外部高速时钟就绪标志位HSERDY,18-31位初始默认为0,更保险的写法为:
    while( (RCC->CR >> 17) & 0x0001 == 0 );
    
  • 运算操作符只在CPU的寄存器中进行,不影响内存的值。所以对RCC_CR移位并不会影响RCC_CR对应的映射内存中的值。
RCC->CR>>17;//不影响RCC_CR的值
RCC->CR = RCC->CR>>17;//会改变RCC_CR的值
  • 第二条语句操作步骤为:

1.将内存中RCC_CR的值复制到CPU寄存器中;
2.在CPU寄存器中右移17位;
3.将CPU寄存器中的值复制回内存中

<h6>锁相环PLL</h6>

  • u_d = u_i - u_o 的相位差,通过相位差来控制VCO频率的快慢,使输出的频率锁定在输入的频率上。假使在反馈线上增加一个N分频器,则 u_d = u_i - u_o/N,那么输出的频率则会锁定在 (N*输入的频率),即实现了N倍频。可用作时钟的倍频。


    锁相环原理框图
  • STM32中,PLL最大输出时钟为72MHz

串口通信


  • CMOS输入端不使用时不能够悬空

  • MAX232电平转换(TTL电平与串口的EIA-RS-232电平特性不匹配)

  • IC(Intergrated Circuit)芯片 datasheet 的作用:
    1.芯片管脚的分配
    2.典型应用电路的接法
    3.电气特性,适用范围,电压极限等

  • 电荷泵:电荷泵可用于升压、产生负压等。典型的电荷泵电路由开关控制部分和电容部分组成,利用电容能够暂时保持电压的特性反复充放电以达到叠加升压的目的,或将正电荷端接地产生负压。因此电路中至少要有2~3个电容(分别起搬运、输出的作用),并且产生的电压并不是很稳定。

  • 电荷泵开关控制部分集成在 IC 中,外围只需要加电容就可以实现。(如max232芯片,开关控制部分集成在max232内部,从datasheet提供的典型应用电路图可看出,外部需连接若干1uF的电容)

  • 二进制小数转十进制:乘积取整法

  • USART 的波特率寄存器 USART_BRR 中由高到低存储了12位的整数位,4位的小数位。将4位二进制小数转化为十进制时,可以按以下步骤进行:
    1.先将小数部分左移4位变成4位整数(相当于乘以16)
    2.将4位整数转化成整数的十进制数
    3.再用16除十进制整数即可得到十进制的小数

  • stm32f10x_usart.c 中,USART_ClearFlag函数为何清零代码是

USARTx->SR = (uint16_t)~USART_FLAG;

而非

USARTx->SR &= (uint16_t)~USART_FLAG;
  • 解答:经过查阅手册,发现USART_SR寄存器如图:


    USART_SR.jpg

    当中仅有9、8、6、5位可写,并且只能写0,因此置零某一位时只要将某位赋值为0,其它位赋值为1并不会影响其它位原本的状态。因此上面两种代码都是正确的。(已调试验证了标记了w0的bit只能写0,写1无效。有些地方标记为 wc,即 wright clear 。rc 同。)

  • USART_DR由2个寄存器 TDR & RDR 组成。可以进行读写操作,读的是 RDR 的值,写的是 TDR 的值。

  • 转义字符 \r 与 \n 的区别

Mac Linux Windows
\r 换行+回到行首 回到行首 /
\n / 换行 换行+回到行首
  • 重定向使printf输出到串口
/*使用 Keil 的 MicroLIB,否则需要考虑 no semihosting 模式*/
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
//
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
    USART_SendData(USART2, (uint8_t) ch); 

  /* Loop until the end of transmission */
     while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
    {

    }
    return ch;
}

中断与事件


  • 中断优先级分组
  • 抢占式优先级(PreemptionPriority) & 响应优先级(SubPriority)

待解决的问题


  • 为什么中断标志位通过写'1'清零?(如 EXTI_PR 寄存器)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • M3系列的单片机的普通I/O口可以设计为输入或者输出模式,并且程序中间可以动态变换;输入时可以配置为模拟输入,浮空...
    君仁知命阅读 1,244评论 0 1
  • 其实这篇文章主要是介绍自己为其写的GPIO库,自己借鉴了原子写的STM32,野火写的K60,还有LPC官方库,然后...
    杨奉武阅读 739评论 0 0
  • 周末的早上,一个陌生的号码打来电话,说下午机房要重启,如果网站有问题希望我能帮忙处理一下。声音有点抖,我想应该是个...
    皮卡球ca阅读 351评论 0 2
  • 听说人的细胞每七年都会完全更新褪换一次,每个七年之后的你究竟还是不是你?我这种学渣凭着道听途说也不得而知。 只是,...
    胜十阅读 653评论 0 0
  • 2017年6月2日 最让我没想到的是,元宝还没到打疫苗的年龄,就让我先打了疫苗。 昨天晚上八点多时候,我一手拿着手...
    叶问酱阅读 181评论 0 1