STM32F10x GPIO配置 之 位绑定

发布者:黄金大花猫最新更新时间:2017-09-18 来源: eefocus关键字:STM32F10x  GPIO配置  位绑定 手机看文章 扫描二维码
随时随地手机看文章

对GPIO进行未绑定,好处:加快对位操作的速度。

1、位绑定公式(操作不同地址区域的位,用下面不同的公式)


2、下面以GPIOA端口的配置进行讲解:





3、对少量位进行绑定的程序例举:


  1. /************************************************************************************************** 

  2.  *  硬件平台:STM32F103VC 

  3.  *  学习重点:GPIOx的位绑定 

  4.  *  实现功能:对于GPIOA端口的第八位输出 跟随 高八位的输入 

  5.  **************************************************************************************************/  

  6.   

  7.  /*============================================================================= 

  8.  * 位绑定公式: 

  9.  * 1、SRAM区域 :0X2200 0000 ----0X200F FFFF 

  10.  *    Aliasaddr = 0X22000000 + ( A -0X20000000 )*32 + n*4 

  11.  * 2、片上外设区域 :0X4200 0000 ----0X400F FFFF 

  12.  *    Aliasaddr = 0X42000000 + ( A -0X40000000 )*32 + n*4 

  13.  * 参数解释: 

  14.  *          Aliasaddr : 设置“端口GPIOx的第n位”的寄存器_相应位的实际地址 

  15.  *          A : 端口GPIOx的基地址(GPIOx_BASE) + 相应寄存器的偏移地址 

  16.  *          n : 配置的是相应寄存器的第n位 

  17.  * 寄存器的偏移地址 :CRL  CRH  IDR  ODR  BSRR  BRR  LCKR 

  18.  *                    00H  04H  08H  0CH  10H   14H  18H  

  19.  =============================================================================*/  

  20.   

  21.   

  22. /* Includes ------------------------------------------------------------------*/  

  23. #include "stm32f10x_lib.h"    //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。  

  24. #include "stm32f10x_map.h"  

  25.   

  26.   

  27. /*----------------------------------------------------------------------------------------------------------- 

  28.  *将GPIOA的第3位作为输出引脚,寄存器ODR的偏移地址为0X0C  

  29.  *  A = GPIOA_BASE + 0X0C = (APB2PERIPH_BASE + 0X0800) + 0X0C = ((PERIPR_BASE + 0X1000) + 0X0800) + 0X0C 

  30.  *                        = ((0X40000000 + 0X1000) + 0X0800) + 0X0C = 0X4001080C 

  31.  *  n = 3  (设置寄存器ODR的第3位) 

  32.  *  将GPIOA的第11位作为输入引脚,寄存器IDR的偏移地址为0X08 

  33.  *  A = GPIOA_BASE + 0X08 = (APB2PERIPH_BASE + 0X0800) + 0X08 = ((PERIPR_BASE + 0X1000) + 0X0800) + 0X08 

  34.  *                        = ((0X40000000 + 0X1000) + 0X0800) + 0X08 = 0X40010808 

  35.  *  n = 11 (设置寄存器IDR的第11位) 

  36.  ------------------------------------------------------------------------------------------------------------*/  

  37.   

  38. u32 *PAO0 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 0*4) ;  

  39. u32 *PAO1 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 1*4) ;  

  40. u32 *PAO2 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 2*4) ;  

  41. u32 *PAO3 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 3*4) ;  

  42. u32 *PAO4 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 4*4) ;  

  43. u32 *PAO5 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 5*4) ;  

  44. u32 *PAO6 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 6*4) ;  

  45. u32 *PAO7 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 7*4) ;  

  46.   

  47. u32 *PAI8 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 8*4) ;  

  48. u32 *PAI9 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 9*4) ;  

  49. u32 *PAI10 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 10*4) ;  

  50. u32 *PAI11 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 11*4) ;  

  51. u32 *PAI12 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 12*4) ;  

  52. u32 *PAI13 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 13*4) ;  

  53. u32 *PAI14 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 14*4) ;  

  54. u32 *PAI15 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 15*4) ;  

  55.   

  56. /* Private functions -----------------------------------------------------------------------------*/   

  57. /************************************************************************************************** 

  58. * Function Name  : main 

  59. * Description    : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出 

  60. * Input          : None 

  61. * Output         : None 

  62. * Return         : None 

  63. ****************************************************************************************************/  

  64. int main(void)  

  65. {  

  66.   

  67.     /*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/  

  68.     //1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH  

  69.         //GPIOA.0-.7推挽输出,速度50MHZ , GPIOA.8-.16浮空输入  

  70.         GPIOA->CRL = 0x33333333 ; // CNF0 = 00 MODE0 = 11  

  71.         GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00  

  72.   

  73.     //2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入  

  74.         while(1)  

  75.         {     

  76.         /*----------------------第0位----------------------*/  

  77.             if( *PAI8 == 1)  //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平  

  78.             {  

  79.                 *PAO0 = 1 ;  //对寄存器GPIOA->ODR的第0位置一  

  80.             }  

  81.             else  

  82.             {  

  83.                 *PAO0 = 0 ; //对寄存器GPIOA->ODR的第0位清零  

  84.             }  

  85.         /*----------------------第1位----------------------*/  

  86.             if( *PAI9 == 1)  //寄存器GPIOA->IDR的第9位为1,表示从在GPIOA.9口输入了高电平  

  87.             {  

  88.                 *PAO1 = 1 ;  //对寄存器GPIOA->ODR的第1位置一  

  89.             }  

  90.             else  

  91.             {  

  92.                 *PAO1 = 0 ; //对寄存器GPIOA->ODR的第1位清零  

  93.             }  

  94.         /*----------------------第2位----------------------*/  

  95.             if( *PAI10 == 1)     //寄存器GPIOA->IDR的第10位为1,表示从在GPIOA.10口输入了高电平  

  96.             {  

  97.                 *PAO2 = 1 ;  //对寄存器GPIOA->ODR的第2位置一  

  98.             }  

  99.             else  

  100.             {  

  101.                 *PAO2 = 0 ; //对寄存器GPIOA->ODR的第2位清零  

  102.             }  

  103.         /*----------------------第3位----------------------*/  

  104.             if( *PAI11 == 1)     //寄存器GPIOA->IDR的第11位为1,表示从在GPIOA.11口输入了高电平  

  105.             {  

  106.                 *PAO3 = 1 ;  //对寄存器GPIOA->ODR的第3位置一  

  107.             }  

  108.             else  

  109.             {  

  110.                 *PAO3 = 0 ; //对寄存器GPIOA->ODR的第3位清零  

  111.             }  

  112.         /*----------------------第4位----------------------*/  

  113.             if( *PAI12 == 1)     //寄存器GPIOA->IDR的第12位为1,表示从在GPIOA.12口输入了高电平  

  114.             {  

  115.                 *PAO4 = 1 ;  //对寄存器GPIOA->ODR的第4位置一  

  116.             }  

  117.             else  

  118.             {  

  119.                 *PAO4 = 0 ; //对寄存器GPIOA->ODR的第4位清零  

  120.             }  

  121.         /*----------------------第5位----------------------*/  

  122.             if( *PAI13 == 1)     //寄存器GPIOA->IDR的第13位为1,表示从在GPIOA.13口输入了高电平  

  123.             {  

  124.                 *PAO5 = 1 ;  //对寄存器GPIOA->ODR的第5位置一  

  125.             }  

  126.             else  

  127.             {  

  128.                 *PAO5 = 0 ; //对寄存器GPIOA->ODR的第5位清零  

  129.             }  

  130.         /*----------------------第6位----------------------*/  

  131.             if( *PAI14 == 1)     //寄存器GPIOA->IDR的第14位为1,表示从在GPIOA.14口输入了高电平  

  132.             {  

  133.                 *PAO6 = 1 ;  //对寄存器GPIOA->ODR的第6位置一  

  134.             }  

  135.             else  

  136.             {  

  137.                 *PAO6 = 0 ; //对寄存器GPIOA->ODR的第6位清零  

  138.             }  

  139.         /*----------------------第7位----------------------*/  

  140.             if( *PAI15 == 1)     //寄存器GPIOA->IDR的第15位为1,表示从在GPIOA.15口输入了高电平  

  141.             {  

  142.                 *PAO7 = 1 ;  //对寄存器GPIOA->ODR的第7位置一  

  143.             }  

  144.             else  

  145.             {  

  146.                 *PAO7 = 0 ; //对寄存器GPIOA->ODR的第7位清零  

  147.             }  

  148.            

  149.         }  

  150.   

  151.         return 1 ;  

  152. }  


4、利用宏定义函数对大量的位进行位绑定的步骤:










5、对大量的位进行位绑定的程序例举:


  1. /************************************************************************************************** 

  2.  *  硬件平台:STM32F103VC 

  3.  *  学习重点:GPIOx的位绑定 

  4.  *  实现功能:对于GPIOA端口的第八位输出 跟随 高八位的输入 

  5.  **************************************************************************************************/  

  6.   

  7.  /*============================================================================= 

  8.  * 位绑定公式: 

  9.  * 1、SRAM区域 :0X2200 0000 ----0X200F FFFF 

  10.  *    Aliasaddr = 0X22000000 + ( A -0X20000000 )*32 + n*4 

  11.  * 2、片上外设区域 :0X4200 0000 ----0X400F FFFF 

  12.  *    Aliasaddr = 0X42000000 + ( A -0X40000000 )*32 + n*4 

  13.  * 参数解释: 

  14.  *          Aliasaddr : 设置“端口GPIOx的第n位”的寄存器_相应位的实际地址 

  15.  *          A : 端口GPIOx的基地址(GPIOx_BASE) + 相应寄存器的偏移地址 

  16.  *          n : 配置的是相应寄存器的第n位 

  17.  * 寄存器的偏移地址 :CRL  CRH  IDR  ODR  BSRR  BRR  LCKR 

  18.  *                    00H  04H  08H  0CH  10H   14H  18H  

  19.  =============================================================================*/  

  20.   

  21.   

  22. /* Includes ------------------------------------------------------------------*/  

  23. #include "stm32f10x_lib.h"    //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。  

  24. #include "stm32f10x_map.h"  

  25.   

  26.   

  27. ///*-----------------------------------------------------------------------------------------------------------  

  28. // *将GPIOA的第3位作为输出引脚,寄存器ODR的偏移地址为0X0C   

  29. // *    A = GPIOA_BASE + 0X0C = (APB2PERIPH_BASE + 0X0800) + 0X0C = ((PERIPR_BASE + 0X1000) + 0X0800) + 0X0C  

  30. // *                          = ((0X40000000 + 0X1000) + 0X0800) + 0X0C = 0X4001080C  

  31. // *    n = 3  (设置寄存器ODR的第3位)  

  32. // *  将GPIOA的第11位作为输入引脚,寄存器IDR的偏移地址为0X08  

  33. // *    A = GPIOA_BASE + 0X08 = (APB2PERIPH_BASE + 0X0800) + 0X08 = ((PERIPR_BASE + 0X1000) + 0X0800) + 0X08  

  34. // *                          = ((0X40000000 + 0X1000) + 0X0800) + 0X08 = 0X40010808  

  35. // *    n = 11 (设置寄存器IDR的第11位)  

  36. // ------------------------------------------------------------------------------------------------------------*/  

  37. //  

  38. //u32 *PAO0 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 0*4) ;  

  39. //u32 *PAO1 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 1*4) ;  

  40. //u32 *PAO2 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 2*4) ;  

  41. //u32 *PAO3 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 3*4) ;  

  42. //u32 *PAO4 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 4*4) ;  

  43. //u32 *PAO5 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 5*4) ;  

  44. //u32 *PAO6 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 6*4) ;  

  45. //u32 *PAO7 = (u32 *)(0X42000000 + (0X4001080C - 0X40000000)*32 + 7*4) ;  

  46. //  

  47. //u32 *PAI8 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 8*4) ;  

  48. //u32 *PAI9 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 9*4) ;  

  49. //u32 *PAI10 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 10*4) ;  

  50. //u32 *PAI11 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 11*4) ;  

  51. //u32 *PAI12 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 12*4) ;  

  52. //u32 *PAI13 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 13*4) ;  

  53. //u32 *PAI14 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 14*4) ;  

  54. //u32 *PAI15 = (u32 *)(0X42000000 + (0X40010808 - 0X40000000)*32 + 15*4) ;  

  55.   

  56. /******************************快速位绑定**********************************************************/  

  57. /*----------------1、宏定义要操作的寄存器地址---------------------------------------------*/  

  58.  #define GPIOA_ODR (GPIOA_BASE + 0X0C)  

  59.  #define GPIOA_IDR (GPIOA_BASE + 0X08)  

  60.   

  61.  #define GPIOB_ODR (GPIOB_BASE + 0X0C)  

  62.  #define GPIOB_IDR (GPIOB_BASE + 0X08)  

  63.   

  64.  #define GPIOC_ODR (GPIOC_BASE + 0X0C)  

  65.  #define GPIOC_IDR (GPIOC_BASE + 0X08)  

  66.   

  67.  #define GPIOD_ODR (GPIOD_BASE + 0X0C)  

  68.  #define GPIOD_IDR (GPIOD_BASE + 0X08)  

  69.   

  70.  #define GPIOE_ODR (GPIOE_BASE + 0X0C)  

  71.  #define GPIOE_IDR (GPIOE_BASE + 0X08)  

  72.   

  73. /*----------------2、获取端口GPIOx(A-E)的对应寄存器的某一操作位的位地址-------------------*/  

  74. // #define BitBand(Addr , BitNum) *( (volatile unsigned long *)(Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)*32) + (BitNum*4) )   

  75. // 因为 左移、右移 语句的执行速度比乘除法语句的运动速度快,所以将上述语句改成如下方式  

  76.  #define BitBand(Addr , BitNum) *( (volatile unsigned long *)( (Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)<<5) + (BitNum<<2) ) )   

  77.     

  78. /*----------------3、宏定义函数,对固定的位绑定 进行功能封装------------------------------*/  

  79.  #define PAout(n) BitBand(GPIOA_ODR , n)   

  80.  #define PAin(n) BitBand(GPIOA_IDR , n)  

  81.   

  82.  #define PBout(n) BitBand(GPIOB_ODR , n)   

  83.  #define PBin(n) BitBand(GPIOB_IDR , n)  

  84.   

  85.  #define PCout(n) BitBand(GPIOC_ODR , n)   

  86.  #define PCin(n) BitBand(GPIOC_IDR , n)  

  87.   

  88.  #define PDout(n) BitBand(GPIOD_ODR , n)   

  89.  #define PDin(n) BitBand(GPIOD_IDR , n)  

  90.   

  91.  #define PEout(n) BitBand(GPIOE_ODR , n)   

  92.  #define PEin(n) BitBand(GPIOE_IDR , n)  

  93.   

  94.   

  95.   

  96. /* Private functions -----------------------------------------------------------------------------*/   

  97. /************************************************************************************************** 

  98. * Function Name  : main 

  99. * Description    : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出 

  100. * Input          : None 

  101. * Output         : None 

  102. * Return         : None 

  103. ****************************************************************************************************/  

  104. int main(void)  

  105. {  

  106.   

  107.     /*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/  

  108.     //1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH  

  109.         //GPIOA.0-.7推挽输出,速度50MHZ , GPIOA.8-.16浮空输入  

  110.         GPIOA->CRL = 0x33333333 ; // CNF0 = 00 MODE0 = 11  

  111.         GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00  

  112.   

  113.     //2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入  

  114.         while(1)  

  115.         {     

  116.         /*----------------------第0位----------------------*/  

  117.             if( PAin(8) == 1)    //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平  

  118.             {  

  119.                 PAout(0) = 1 ;  //对寄存器GPIOA->ODR的第0位置一  

  120.             }  

  121.             else  

  122.             {  

  123.                 PAout(0) = 0 ;  //对寄存器GPIOA->ODR的第0位清零  

  124.             }  

  125.         /*----------------------第1位----------------------*/  

  126.             if( PAin(9) == 1)    //寄存器GPIOA->IDR的第9位为1,表示从在GPIOA.9口输入了高电平  

  127.             {  

  128.                 PAout(1) = 1 ;  //对寄存器GPIOA->ODR的第1位置一  

  129.             }  

  130.             else  

  131.             {  

  132.                 PAout(1) = 0 ;  //对寄存器GPIOA->ODR的第1位清零  

  133.             }  

  134.         /*----------------------第2位----------------------*/  

  135.             if( PAin(10) == 1)   //寄存器GPIOA->IDR的第10位为1,表示从在GPIOA.10口输入了高电平  

  136.             {  

  137.                 PAout(2) = 1 ;  //对寄存器GPIOA->ODR的第2位置一  

  138.             }  

  139.             else  

  140.             {  

  141.                 PAout(2) = 0 ;  //对寄存器GPIOA->ODR的第2位清零  

  142.             }  

  143.         /*----------------------第3位----------------------*/  

  144.             if( PAin(11) == 1)   //寄存器GPIOA->IDR的第11位为1,表示从在GPIOA.11口输入了高电平  

  145.             {  

  146.                 PAout(3) = 1 ;  //对寄存器GPIOA->ODR的第3位置一  

  147.             }  

  148.             else  

  149.             {  

  150.                 PAout(3) = 0 ;  //对寄存器GPIOA->ODR的第3位清零  

  151.             }  

  152.         /*----------------------第4位----------------------*/  

  153.             if( PAin(12) == 1)   //寄存器GPIOA->IDR的第12位为1,表示从在GPIOA.12口输入了高电平  

  154.             {  

  155.                 PAout(4) = 1 ;  //对寄存器GPIOA->ODR的第4位置一  

  156.             }  

  157.             else  

  158.             {  

  159.                 PAout(4) = 0 ;  //对寄存器GPIOA->ODR的第4位清零  

  160.             }  

  161.         /*----------------------第5位----------------------*/  

  162.             if( PAin(13) == 1)   //寄存器GPIOA->IDR的第13位为1,表示从在GPIOA.13口输入了高电平  

  163.             {  

  164.                 PAout(5) = 1 ;  //对寄存器GPIOA->ODR的第5位置一  

  165.             }  

  166.             else  

  167.             {  

  168.                 PAout(5) = 0 ;  //对寄存器GPIOA->ODR的第5位清零  

  169.             }  

  170.         /*----------------------第6位----------------------*/  

  171.             if( PAin(14) == 1)   //寄存器GPIOA->IDR的第14位为1,表示从在GPIOA.14口输入了高电平  

  172.             {  

  173.                 PAout(6) = 1 ;  //对寄存器GPIOA->ODR的第6位置一  

  174.             }  

  175.             else  

  176.             {  

  177.                 PAout(6) = 0 ;  //对寄存器GPIOA->ODR的第6位清零  

  178.             }  

  179.         /*----------------------第7位----------------------*/  

  180.             if( PAin(15) == 1)   //寄存器GPIOA->IDR的第15位为1,表示从在GPIOA.15口输入了高电平  

  181.             {  

  182.                 PAout(7) = 1 ;  //对寄存器GPIOA->ODR的第7位置一  

  183.             }  

  184.             else  

  185.             {  

  186.                 PAout(7) = 0 ;  //对寄存器GPIOA->ODR的第7位清零  

  187.             }  

  188.            

  189.         }  

  190.   

  191.         return 1 ;  

  192. }  


关键字:STM32F10x  GPIO配置  位绑定 引用地址:STM32F10x GPIO配置 之 位绑定

上一篇:串行通信 软件仿真STM32与74LS164通信
下一篇:STM32F103 通过配置寄存器来控制I/O口

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

STM32F10x的复位及时钟控制
简介:RC(Reset and Clock Control)复位和时钟控制,STM32F10x支持三种复位形式,分别为系统复位、上电复位和备份区域复位。 RC(Reset and Clock Control)复位和时钟控制 STM32F10x支持三种复位形式,分别为系统复位、上电复位和备份区域复位。 系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器以外的所有寄存器。 当以下事件中的一件发生时,产生一个系统复位: 1. NRST管脚上的低电平(外部复位) 2. 窗口看门狗计数终止(WWDG复位) 3. 独立看门狗计数终止(IWDG复位) 4. 软件复位(SW复位) 5. 低功耗管理复位 可通过查看RC
[单片机]
<font color='red'>STM32F10x</font>的复位及时钟控制
STM32F10x 学习笔记10(基本定时器)
大容量的STM32F101xx、STM32F103xx系列和互联型产品中包含了两个基本定时器,TIM6和TIM7。这两个定时器功能非常简单,基本上和SysTick 定时器相当。 但是我在使用的时候确是费了一番周折才调试通过,所以还是应该将这两个定时器的使用方法好好的写一写。 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。简单的说两个定时器是从0计数到N(由自动装载计数器来确定N的具体值),然后复位回0 重新计数。每次复位到0 的时候可以产生对应的中断信号,或者产生DMA 请求,还可以触发DAC 同步电路。不过这次笔记不讨论触发DAC 的问题,等写到DAC 的使用时在讲解如何用这两定时器驱动
[单片机]
<font color='red'>STM32F10x</font> 学习笔记10(基本定时器)
STM32F10x单片机Flash写操作导致中断不响应问题
昨天遇到一个问题,在写入数据到STM32F103单片机的Flash中时会出现串口中断接收数据丢失现象,但是我设置的串口接收中断优先级是最高的,并且没有哪里将全局中断关闭很长时间(除了操作系统部分内核代码执行的时候关闭全局中断,但是没有占用很长时间,不会导致丢失串口数据)。在正常情况下在没有写数据到Flash中去的时候所有串口数据都能正常接收,没有数据丢包现象,但是当执行一次写入操作(写一个页256个字的数据)就会导致串口数据丢失,导致接收帧错误。 一开始我猜测是不是在擦除和写入Flash的时候系统会屏蔽所有中断,但是没有哪个参考文档中找到这样的说明。后来查阅了一下官方文档PM0042《STM32F10xxx闪存编程手册.en》,在
[单片机]
stm32f10x的AD配置
#include stm32f10x_lib.h #include stdio.h #define ADC1_DR_Address ((u32)0x4001244C) int AD_value; static unsigned long ticks; unsigned char Clock1s; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; vu16 ADC_ConvertedValue; ErrorStatus HSEStartUpStatus; void RCC_Configuration(void); v
[单片机]
STM32-点亮LED灯(GPIO配置
点亮LED灯应该是每一人学习硬件的第一个实验了吧!从51到32在到ARM,废话少说,下面开始使用STM32点亮LED灯。 GPIO:又叫通用输入输出口,是微控制器必不可少的外设单元,用来和外界进行信号传递,数据交互的接口。 STM32的GPIO根据型号的不同分为A-H组,每一组都称为GPIOx组,每组都有独立的寄存器,因为相对于寄存器,函数版的使用还是比较容易入门的,尤其是有些编程基础的人来讲,但是寄存器是不可以忽视的,学会了基础的函数操作还是要回头去看看具体寄存器是如何运行的,这点很重要,高手和菜鸟的区别吧! STM32的GPIO还具有十分强大复用功能,这点以后会介绍和使用到。现在就把它的GPIO当成一个可输出高低电平的引脚就可
[单片机]
电位器 ADC stm32f10x开发
1、电位器 2、模块线的连接 注意: 一定接 3.3 v ,不然会烧坏 单片机的ADC 3、程序开发 程序链接: https://download.csdn.net/download/qq_37788383/11887697 #include adc.h #include sys.h #include delay.h #include usart.h /************************************************ 实验0:ALIENTEK STM32F103开发板工程模板 注意,这是手册中的调试章节使用的main文件 ***********************
[单片机]
电位器 ADC <font color='red'>stm32f10x</font>开发
STM32——GPIO详细配置
一、STM32中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 -
[单片机]
stm32f030-GPIO配置
一、 GPIO模式配置 1、输入/输出模式(参考stm32手册) 2、GPIO输出模式下,几种速度的区别: (1). GPIO 引脚速度: GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果信号频率为1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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