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
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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