STM32GPIO的描述和配置

发布者:吉州古玩斋最新更新时间:2018-07-07 来源: eefocus关键字:STM32  GPIO  描述和配置 手机看文章 扫描二维码
随时随地手机看文章

一、GPIO的综合描述


stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。


      (一)每一个IO引脚都可以使用软件配置为以下几种模式:


   1. 浮空输入

  2. 带上拉输入

  3. 带下拉输入

  4. 模拟输入

  5. 开漏输出——(此模式可实现hotpower说的真双向IO)

  6. 推挽输出

  7. 复用功能的推挽输出

  8. 复用功能的开漏输出

 模式7和模式8需根据具体的复用功能决定。


每一个IO引脚都可以单独编程,但是每一个IO寄存器只能32bits访问(半字或者字节访问都被禁止)。


 


(二)专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

(三)每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

(四)I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

(五)所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

(六)大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

(七)具有独立的唤醒I/O口。

(八)很多I/O口的复用功能可以重新映射。

(九)GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。


三、GPIO的配置


 


(一)   GPIO模式选择和速度匹配


(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1。


  (2)带上拉输入_IPU——IO内部上拉电阻输入。


(3)带下拉输入_IPD—— IO内部下拉电阻输入。


(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电。


(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能。


(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的。


(7)复用功能的推挽输出_AF_PP ——片内外设功能(I 2C的SCL,SDA)


(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK)


 


GPIO输出的速度匹配:


GPIO_Speed_10MHz 最高输出速率10MHz


GPIO_Speed_2MHz 最高输出速率2MHz


GPIO_Speed_50MHz 最高输出速率50MHz


  I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个不同响应速度的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

有一点是关键,即GPIO的引脚速度跟应用匹配(推荐10倍以上)。比如:

1) 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

2 )对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

3 )对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。


 


(二)   在STM32中如何配置片内外设使用的IO端口

 ①配置输入的时钟;②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。

对应到外设的输入输出功能有下述三种情况:

 ①外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。

②外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。

③ADC对应的管脚:配置管脚为模拟输入。 

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。 


(三)     通用IO端口(GPIO)初始化:

1、 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟;

2 、RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位;


3、配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)和匹配速度。

4 、GPIO初始化完成


 


四、GPIO实例


 


#include "stm32f10x.h"


#include "stm32_eval.h"


 


GPIO_InitTypeDef GPIO_InitStructure;


 


void RCC_Configuration(void);


void Delay(__IO uint32_t nCount);


 


 


int main(void)



  RCC_Configuration();  


 


#if 0


  // 配置所有未使用GPIO引脚为输入模式(浮空输入),这样可以降低功耗,并且提高器件的抗EMI/EMC 的性能 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |


                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |


                         RCC_APB2Periph_GPIOE, ENABLE);


 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;


  GPIO_Init(GPIOA, &GPIO_InitStructure);


  GPIO_Init(GPIOB, &GPIO_InitStructure);


  GPIO_Init(GPIOC, &GPIO_InitStructure);


 


  //armfly :注释掉的原因是当代码在外部存储器运行时,GPIOD,E,F,G部分IO用于FSMC,因此对这些IO不能重置,否则导致取指异常


  // GPIO_Init(GPIOD, &GPIO_InitStructure);


  // GPIO_Init(GPIOE, &GPIO_InitStructure);


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |


                         RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |


                         RCC_APB2Periph_GPIOE, DISABLE); 


#ifdef USE_STM3210E_EVAL


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);


  // armfly :由于代码在外部SRAM运行时,GPIOD,E,F,G部分IO用于FSMC,


      因此对这些IO不能重置,否则导致取指异常


  //  GPIO_Init(GPIOF, &GPIO_InitStructure);


  //  GPIO_Init(GPIOG, &GPIO_InitStructure);


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, DISABLE);


#endif


#endif


 


  // 初始化STM3210X-EVAL板上的4个LED,即初始化LED对应的IO引脚


  STM_EVAL_LEDInit(LED1);


  STM_EVAL_LEDInit(LED2);


  STM_EVAL_LEDInit(LED3);


  STM_EVAL_LEDInit(LED4);


 


  while (1)


  { 


    STM_EVAL_LEDOn(LED1);


   


       // 原始值 = 0xAFFFF,但是当代码在外部RAM运行时,效率很低,会延迟10秒以上,而到代码在内部RAM或内部Flash执行时,速度很快,小于100ms


       Delay(0xAFFFF);


 


    // Turn on LD2 and LD3


    STM_EVAL_LEDOn(LED2);


    STM_EVAL_LEDOn(LED3);


    // Turn off LD1


    STM_EVAL_LEDOff(LED1);


    // Insert delay


    Delay(0xAFFFF);


 


// Turn on LD4    


 STM_EVAL_LEDOn(LED4);


    //Turn off LD2 and LD3


    STM_EVAL_LEDOff(LED2);


    STM_EVAL_LEDOff(LED3);


    //Insert delay


    Delay(0xAFFFF);


 


    //Turn off LD4


    STM_EVAL_LEDOff(LED4);


  }


}


 


void RCC_Configuration(void)


{  


  // 建立MCU系统,初始化嵌入式FLASH接口,初始化锁相环(附注1)和系统频率参数


  SystemInit();


}


 


void Delay(__IO uint32_t nCount)


{


  for(; nCount != 0; nCount--);


}


 


#ifdef  USE_FULL_ASSERT


  // @brief  Reports the name of the source file and the source line number


//  where the assert_param error has occurred.


 //@param  file: pointer to the source file name


// @param  line: assert_param error line source number


  // @retval None


void assert_failed(uint8_t* file, uint32_t line)


{


 // User can add his own implementation to report the file name and line number,


     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line)


  //Infinite loop   


while (1)


  {


  }


}


#endif


 


//******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****


 


void SystemInit (void)在system_stm32f10x.c中:


 


void SystemInit (void)


{


 // 复位RCC时钟配置到默认状态(用于调试)


// Set HSION bit


  RCC->CR |= (uint32_t)0x00000001;


 


  //Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits


#ifndef STM32F10X_CL


  RCC->CFGR &= (uint32_t)0xF8FF0000;


#else


  RCC->CFGR &= (uint32_t)0xF0FF0000;


#endif //STM32F10X_CL 


 


  // Reset HSEON, CSSON and PLLON bits


  RCC->CR &= (uint32_t)0xFEF6FFFF;


 


  // Reset HSEBYP bit


  RCC->CR &= (uint32_t)0xFFFBFFFF;


 


  //Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits


  RCC->CFGR &= (uint32_t)0xFF80FFFF;


 


#ifdef STM32F10X_CL


  //Reset PLL2ON and PLL3ON bits


  RCC->CR &= (uint32_t)0xEBFFFFFF;


 


//Disable all interrupts and clear pending bits 


  RCC->CIR = 0x00FF0000;


 


  // Reset CFGR2 register


  RCC->CFGR2 = 0x00000000;


#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)


  // Disable all interrupts and clear pending bits


  RCC->CIR = 0x009F0000;


 


  //Reset CFGR2 register


  RCC->CFGR2 = 0x00000000;     


#else


  // Disable all interrupts and clear pending bits


  RCC->CIR = 0x009F0000;


#endif // STM32F10X_CL


   


#if defined (STM32F10X_HD) || (defined STM32F10X_XL)


  #ifdef DATA_IN_ExtSRAM


    SystemInit_ExtMemCtl();


  #endif // DATA_IN_ExtSRAM


#endif


 


  //配置系统时钟频率,HCLK, PCLK2 和 PCLK1 的预分频


  //配置Flash延迟周期,使能预存取缓冲区


  SetSysClock();


}


 


再次总结一下GPIO的配置


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//


(1)      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B |C, ENABLE):使能APB2总线外设时钟


(2)     RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位


 GPIO_InitTypeDefGPIO_InitStructure;

 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;

 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //开漏输出

 GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; //50M时钟速度


//gpio A组中的哪些引脚,什么模式 速度 


 


typedefstruct

{

  uint16_t GPIO_Pin;

  GPIOSpeed_TypeDef GPIO_Speed;

  GPIOMode_TypeDef GPIO_Mode;

}GPIO_InitTypeDef;


 


typedef enum

{

  GPIO_Speed_10MHz = 1,

  GPIO_Speed_2MHz,

  GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;


 


typedef enum

{ GPIO_Mode_AIN =0x0,   //模拟输入

  GPIO_Mode_IN_FLOATING =0x04, //浮空输入

  GPIO_Mode_IPD =0x28,   //下拉输入

  GPIO_Mode_IPU =0x48,   //上拉输入

  GPIO_Mode_Out_OD =0x14,  //开漏输出

  GPIO_Mode_Out_PP =0x10,  //推挽输出

  GPIO_Mode_AF_OD =0x1C,  //开漏复用功能

  GPIO_Mode_AF_PP =0x18  //推挽复用功能

}GPIOMode_TypeDef;  


库写的相当严谨 使用了枚举,也可见IO 的功能之多性能之强~!


 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO口配置结束。


 


附注1:PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。


 


附注2:STM32的GPIO口的输出:开漏输出和推挽输出 


1、推挽输出与开漏输出的区别:

>>推挽输出:可以输出高,低电平,连接数字器件

>>开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).


推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.

要实现 线与 需要用OC(open collector)门电路.是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。


 


当端口配置为输出时:


开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。


                输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路),也就是说此模式下只有N-MOS对输出起作用;此模式可以把端口作为双向IO使用。


 推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。


    输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。


简单来说,开漏是0的时候接GND ,1的时候浮空;推挽是0的时候接GND ,1的时候接VCC。



2、开漏电路特点及应用

    在电路设计时我们常常遇到开漏(open drain)和开集(open collector)的概念。所谓开漏电路概念中提到的“漏”就是指MOSFET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。

组成开漏形式的电路有以下几个特点:

1) 利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。

2) 可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。

3)可以利用改变上拉电源的电压,改变传输电平。IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。

4)开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。

5)标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。

应用中需注意:

1)   开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入Pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。 

2)上拉电阻R pull-up的 阻值 决定了 逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小。反之亦然。

   Push-Pull输出就是一般所说的推挽输出,在CMOS电路里面Push-Pull输出更合适,因为在CMOS里面的push-pull输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。和开漏输出相比,push-pull的高低电平由IC的电源决定,不能简单的做逻辑操作等。 push-pull是现在CMOS电路里面用得最多的输出级设计方式。

3、什么是OC、OD

集电极开路门(集电极开路 OC 或源极开路OD)

open-drain是漏极开路输出的意思,相当于集电极开路(open-collector)输出,即ttl中的集电极开路(oc)输出。一般用于线或、线与,也有的用于电流驱动。

open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。

开漏形式的电路有以下几个特点:

1)利用外部电路的驱动能力,减少IC内部的驱动。 或驱动比芯片电源电压高的负载.

2) 可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。如果作为图腾输出必须接上拉电阻。接容性负载时,下降延是芯片内的晶体管,是有源驱动,速度较快;上升延是无源的外接电阻,速度慢。如果要求速度高电阻选择要小,功耗会大。所以负载电阻的选择要兼顾功耗和速度。

3)可以利用改变上拉电源的电压,改变传输电平。例如加上上拉电阻就可以提供TTL/CMOS电平输出等。

4)开漏Pin不连接外部的上拉电阻,则只能输出低电平。一般来说,开漏是用来连接不同电平的器件,匹配电平用的。

5)正常的CMOS输出级是上、下两个管子,把上面的管子去掉就是OPEN-DRAIN了。这种输出的主要目的有两个:电平转换和线与。

6)由于漏级开路,所以后级电路必须接一上拉电阻,上拉电阻的电源电压就可以决定输出电平。这样你就可以进行任意电平的转换了。

7)线与功能主要用于有多个电路对同一信号进行拉低操作的场合,如果本电路不想拉低,就输出高电平,因为OPEN-DRAIN上面的管子被拿掉,高电平是靠外接的上拉电阻实现的。(而正常的CMOS输出级,如果出现一个输出为高另外一个为低时,等于电源短路。)

8)OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

4、什么是线或逻辑与线与逻辑?

   在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上.

因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS), 晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.

注:个人理解:线与,接上拉电阻至电源。(~A)&(~B)=~(A+B),由公式较容易理解线与此概念的由来 ;

如果用下拉电阻和 PNP 或 PMOS 管就可以构成与非 NAND 逻辑, 或用负逻辑关系转换与/或逻辑.

注:线或,接下拉电阻至地。(~A)+(~B)=~(AB);

这些晶体管常常是一些逻辑电路的集电极开路 OC 或源极开路 OD 输出端. 这种逻辑通常称为线与/线或逻辑, 当你看到一些芯片的 OC 或 OD 输出端连在一起, 而有一个上拉电阻时, 这就是线或/线与了, 但有时上拉电阻做在芯片的输入端内.

顺便提示如果不是 OC 或 OD 芯片的输出端是不可以连在一起的, 总线 BUS 上的双向输出端连在一起是有管理的, 同时只能有一个作输出, 而其他是高阻态只能输入.

5、什么是推挽结构

一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.要实现线与需要用OC(open collector)门电路 .如果输出级的有两个三极管,始终处于一个导通、一个截止的状态,也就是两个三级管推挽相连,这样的电路结构称为推拉式电路或图腾柱(Totem- pole)输出电路(可惜,图无法贴上)。当输出低电平时,也就是下级负载门输入低电平时,输出端的电流将是下级门灌入T4;当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经 T3、D1 拉出。这样一来,输出高低电平时,T3 一路和 T4 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。供你参考。

推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小效率高。

输出既可以向负载灌电流,也可以从负载抽取电流。


关键字:STM32  GPIO  描述和配置 引用地址:STM32GPIO的描述和配置

上一篇:stm32GPIO学习
下一篇:关于STM32GPIO工作模式

推荐阅读最新更新时间:2024-03-16 16:07

关于STM32的flash读写数据HardFault_Handler的问题
简介:今天调试程序的时候需要把掉电前的数据存储到flash中之后等待下次初始化的时候把数据读进来。刚刚开始的时候去找了一些stm32的flash的操作,真的是废话连篇的真正能用到的没几句话,这里我把自己调试好的flash读写数据的子函数跟大家分享一下。 void FLASH_WriteByte(u32 addr ,u16 flashdata1) { FLASH_Status FLASHstatus = FLASH_COMPLETE; FLASH_Unlock();//解锁 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTER
[单片机]
STM32学习笔记——5个串口的使用方法
串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。 配置串口包括三部分内容: 1. I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入(GPIO_Mode_IN_FLOATING); 2. 串口配置:波特率等; 3. 中断向量配置:一般用中断方式接收数据。 注意事项:
[单片机]
直流无刷有感电机介绍以及STM32无刷电机轮速测量方案
无刷有感测速、速度闭环控制 0.前言 随着ROS移动技术的发展,小伙伴们已经不在满足于低功率的差速小车了,希望可以搭建功率更高的ROS移动机器人平台。常见的高功率的移动机器人多是采用无刷轮毂电机,于是就出现了本篇文章,给大家提供一个轮毂电机的测速以及控制的思路。 1.直流无刷有感电机介绍 无刷直流 (Brushless Direct Current, )电机是一种正快速普及的电机类型,在移动机器人领域也有诸多应用,这里我们将对无刷直流电机的常见问题进行描述。 (1)工作原理 首先,我们来看一下的工作原理,下图为三电极、二磁极、内转子无刷电机演示。 无刷
[机器人]
stm32输出pwm波使无刷电机转起来
现阶段使用stm32,基本处于模仿阶段,用野火的教程以及程序,修改一些IO口,然后烧到自己的开发板上,实现一些功能。 第二个实验室了解pwm波这个东西,脉宽调制,调节占空比可以改变电机转速,原理可以看刘洋老师的基础视频,讲的很详细。 修改野火的pwm程序,野火用了四个通道,我只用了TIM4的第一通道,程序如下: #include pwm_output.h void pwm_value(void) { TIM4- CCR1=1300; } /* * 函数名:TIM3_GPIO_Config * 描述 :配置TIM3复用输出PWM时用到的I/O * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static v
[单片机]
一种基于STM32的心电采集仪设计
  如今,心血管类疾病已经成为威胁人类身体健康的重要疾病之一,而清晰有效的心电图为诊断这类疾病提供了依据,心电采集电路是心电采集仪的关键部分,心电信号属于微弱信号,其频率范围在0.03~100 Hz之间,幅度在0~5 mV之间,同时心电信号还掺杂有大量的干扰信号,因此,设计良好的滤波电路和选择合适的控制器是得到有效心电信号的关键。基于此,本文设计了以STM32为控制核心,AD620和OP07为模拟前端的心电采集仪,本设计简单实用,噪声干扰得到了有效抑制。   1 总体设计方案   心电采集包括模拟采集和数字处理两部分,本设计通过AgCl电极和三导联线心电采集线采集人体心电信号,通过前置放大电路,带通滤波电路,50 Hz双T陷波
[单片机]
一种基于<font color='red'>STM32</font>的心电采集仪设计
基于STM32定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法。这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程。 一般来讲,使用STM32定时器的捕获功能来实现脉宽测量,我们可以选用一个通道、也可以使用两个通道。使用1个通道时,只需使用定时器基本的输入捕获功能结合中断或DMA即可实现;若使用两个通道时可以将捕获功能与定时器的从模式来相结合完成。这里就两种方案的实现示例都做个简单介绍。 不妨先介绍基于单个通道的输入捕获功能来实现对1路信号脉冲宽度及占空比的测量,并在测量过程中统计用于测量的定时器自身的溢出事件,以保障即使被测信号脉宽长于测量定时器自身的溢出周期时也能有效测量。 这
[单片机]
基于<font color='red'>STM32</font>定时器捕获测量脉宽的应用示例
STM32 ISL1208编程
view plain copy //ISL1208.h #ifndef _ISL1208_H_ #define _ISL1208_H_ #include stm32f10x.h typedef struct My_Time { u8 _year; u8 _month; u8 _day; u8 _hour; u8 _min; u8 _sec; u8 _week; } MY_TIME,*pMY_TIME; extern MY_TIME sMyTime; void ISL128Init(void); void Set
[单片机]
使用VSCode搭建STM32开发环境
首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 一、需要的软件和工具。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “VS Code下载地址:https://code.visualstudio.com/” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。 “LLVM下载地址:http://releases.llvm.org/download.html” 下载安装 Git for Windows: 提供Git支持和MINGW64指令终端
[单片机]
使用VSCode搭建<font color='red'>STM32</font>开发环境
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved