STM32 串行通信 USART 程序例举

发布者:WiseSage123最新更新时间:2017-09-18 来源: eefocus关键字:STM32  串行通信  USART 手机看文章 扫描二维码
随时随地手机看文章

1、串行通信 软件仿真STM32通过串口USART1发送26个英文字母(配置寄存器)


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

  2.  *  硬件平台:STM32F103VC 

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

  4.  *  实现功能:软件仿真,实现STM32通过USART1发送数据 

  5.  *  配置寄存器实现(其中打开系统时钟和GPIO引脚的配置是通过库函数实现的,后面会具体讲解) 

  6.  **************************************************************************************************/  

  7.   

  8.  /*============================================================================= 

  9.  * 位绑定公式: 

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

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

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

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

  14.  * 参数解释: 

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

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

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

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

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

  20.  =============================================================================*/  

  21.   

  22.   

  23. /* Includes ------------------------------------------------------------------*/  

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

  25. #include "stm32f10x_map.h"  

  26.   

  27.   

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

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

  30.  #define GPIOA_ODR (GPIOA_BASE + 0X0C)  

  31.  #define GPIOA_IDR (GPIOA_BASE + 0X08)  

  32.   

  33.  #define GPIOB_ODR (GPIOB_BASE + 0X0C)  

  34.  #define GPIOB_IDR (GPIOB_BASE + 0X08)  

  35.   

  36.  #define GPIOC_ODR (GPIOC_BASE + 0X0C)  

  37.  #define GPIOC_IDR (GPIOC_BASE + 0X08)  

  38.   

  39.  #define GPIOD_ODR (GPIOD_BASE + 0X0C)  

  40.  #define GPIOD_IDR (GPIOD_BASE + 0X08)  

  41.   

  42.  #define GPIOE_ODR (GPIOE_BASE + 0X0C)  

  43.  #define GPIOE_IDR (GPIOE_BASE + 0X08)  

  44.   

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

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

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

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

  49.     

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

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

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

  53.   

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

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

  56.   

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

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

  59.   

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

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

  62.   

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

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

  65.   

  66.   

  67. /*----------------函数声明部分---------------*/  

  68. void delay1ms(int t) ;  

  69. void RCC_Configuration(void) ;  

  70. void GPIO_Configuration(void) ;  

  71.   

  72.   

  73. /* Private functions -----------------------------------------------------------------------------*/   

  74. /************************************************************************************************** 

  75. * Function Name  : main 

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

  77. * Input          : None 

  78. * Output         : None 

  79. * Return         : None 

  80. ****************************************************************************************************/  

  81. int main(void)  

  82. {  

  83.   

  84.     float Div;  //计算波特率时公式里面的除数  

  85.     u16 M,F;    //临时存储Div的整数部分的数字和小数部分的数字  

  86.     u32 Bound,BRR;  //Bound:要设置的波特率 , BRR:是Div的整数部分和小数部分整合后存入寄存器USART1->BRR中的值  

  87.     u8  data='A';   //存放要发送的数据  

  88.   

  89.     RCC_Configuration(); //配置开启系统时钟  

  90.     GPIO_Configuration();  //配置IO口  

  91.   

  92.     /*--------USART1模块的设置:UE位使能、M位来定义字长、停止位的位数、TE位、BRR寄存器选择要求的波特率----------------*/  

  93.     USART1->CR1 |= (1<<13);     //位于寄存器CR1的第13位。UE = 1 ;对USART1进行使能。(=0时,分频器和输出被禁止)  

  94.     USART1->CR1 &= ~(1<<12);  //位于寄存器CR1的第12位。M = 0 ;无奇偶校验位,起始位+8位数据+停止位(=1时,带一位奇偶校验位)  

  95.     USART1->CR2 &= ~(3<<12);  //位于寄存器CR2的第13-12位。STOP = 00 ;1位停止位。(=01;0.5位。 =10;2位。 =11;1.5位)  

  96.     USART1->CR1 |= (1<<3);   //位于寄存器CR1的第3位。USART1的发送使能位。TE = 1 ;发送使能(=0时,禁止发送)  

  97.   

  98.     Bound = 9600; //设置波特率  

  99.     Div = (float)(72*1000*1000)/(Bound*16);   //乘以16是因为该芯片是16位的。(寄存器也是16位的)  

  100.     M = Div;  

  101.     F = (Div-M)*16;  

  102.     BRR = M<<4|F;  

  103.     USART1->BRR = BRR;     

  104.   

  105.     /*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/  

  106.     for(F=0;F<26;F++)  

  107.     {  

  108.         USART1->DR = data;  

  109.         data++;  

  110.         while((USART1->SR & (1<<6))==0) ;  

  111.     }  

  112.   

  113. }  

  114.   

  115. /******************************************************************************* 

  116. * Function Name  : Delay_Ms 

  117. * Description    : delay 1 ms. 

  118. * Input          : dly (ms) 

  119. * Output         : None 

  120. * Return         : None 

  121. *******************************************************************************/  

  122. void delay1ms(int t)  

  123. {  

  124.     //机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us  

  125.     int temp = 6000/4 ;  

  126.     while(t--)  

  127.     {  

  128.         while(temp--)  

  129.         { ; }     

  130.     }  

  131.   

  132. }  

  133.   

  134.   

  135. /******************************************************************************* 

  136. * Function Name  : RCC_Configuration 

  137. * Description    : Configures the different system clocks. 

  138. * Input          : None 

  139. * Output         : None 

  140. * Return         : None 

  141. *******************************************************************************/  

  142. void RCC_Configuration(void)  

  143. {  

  144.     //----------使用外部RC晶振-----------  

  145.     RCC_DeInit();           //初始化为缺省值  

  146.     RCC_HSEConfig(RCC_HSE_ON);  //使能外部的高速时钟   

  147.     while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪  

  148.       

  149.     //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer  

  150.     //FLASH_SetLatency(FLASH_Latency_2);        //Flash 2 wait state  

  151.       

  152.     RCC_HCLKConfig(RCC_SYSCLK_Div1);        //HCLK = SYSCLK  

  153.     RCC_PCLK2Config(RCC_HCLK_Div1);         //PCLK2 =  HCLK  

  154.     RCC_PCLK1Config(RCC_HCLK_Div2);         //PCLK1 = HCLK/2  

  155.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ  

  156.     RCC_PLLCmd(ENABLE);         //Enable PLLCLK  

  157.   

  158.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready  

  159.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //Select PLL as system clock  

  160.     while(RCC_GetSYSCLKSource()!=0x08);     //Wait till PLL is used as system clock source  

  161.       

  162.     //---------打开相应外设时钟--------------------  

  163.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能APB2外设的GPIOA的时钟   

  164.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    //使能APB2外设的GPIOC的时钟  

  165.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   

  166.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  

  167.       

  168.     //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);       

  169.            

  170. }  

  171.   

  172. /******************************************************************************* 

  173. * Function Name  : GPIO_Configuration 

  174. * Description    : 初始化GPIO外设 

  175. * Input          : None 

  176. * Output         : None 

  177. * Return         : None 

  178. *******************************************************************************/   

  179. void GPIO_Configuration(void)  

  180. {  

  181.   GPIO_InitTypeDef GPIO_InitStructure;  

  182.   

  183.   /* Configure USARTx_Tx as alternate function push-pull */  

  184.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  

  185.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  186.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  187.   GPIO_Init(GPIOA, &GPIO_InitStructure);  

  188.   

  189.   /* Configure USARTx_Rx as input floating */  

  190.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  

  191.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

  192.   GPIO_Init(GPIOA, &GPIO_InitStructure);  

  193.   

  194. }  

程序运行前的仿真界面:


程序运行后的仿真界面:




2、串行通信 软件仿真STM32通过串口USART1发送26个英文字母(调用库函数)

首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对USART1进行参数配置




下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式、波特率用户可以自定的串口:



源程序:


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

  2.  *  硬件平台:STM32F103VC 

  3.  *  学习重点:调用库函数来实现对USART的操作 

  4.  *  实现功能:软件仿真,实现STM32通过USART1发送数据 

  5.  *  作    者:赵小龙 

  6.  **************************************************************************************************/  

  7.   

  8.   

  9. /* Includes ------------------------------------------------------------------*/  

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

  11. #include "stm32f10x_map.h"  

  12.   

  13.   

  14. /*----------------函数声明部分---------------*/  

  15. void delay1ms(int t) ;  

  16. void RCC_Configuration(void) ;  

  17. void GPIO_Configuration(void) ;  

  18. void USART_Configuration(u32 BaudRate) ;  

  19.   

  20.   

  21. /* Private functions -----------------------------------------------------------------------------*/   

  22. /************************************************************************************************** 

  23. * Function Name  : main 

  24. * Description    : 软件仿真,从USART1发送26个大写的英文字母 

  25. * Input          : None 

  26. * Output         : None 

  27. * Return         : None 

  28. ****************************************************************************************************/  

  29. int main(void)  

  30. {  

  31.   

  32.     u8 i,data;    

  33. /*--------配置开启系统时钟、配置USART1发送/接收使用的两个I/O口、配置USART1---------------------------------------------*/  

  34.     RCC_Configuration();  

  35.     GPIO_Configuration();  

  36.     USART_Configuration(19600);  

  37.   

  38. /*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/  

  39.     data='A';  

  40.     for(i=0;i<26;i++)  

  41.     {  

  42.         USART_SendData(USART1, data) ;  

  43.         data++ ;  

  44.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;//发送完成标志位为1时便是数据发送完毕,若为0时则应让程序等待(等待数据发送发送完成)  

  45.         /*注意:这里最好不要按照以下形式书写,否则会出错,具体原因我暂且还不知道 

  46.             u8 status ;  

  47.             status = USART_GetFlagStatus(USART1, USART_FLAG_TC) ;  //将查看状态寄存器的函数的返回值赋值给变量status  

  48.             while(status == RESET) ; 

  49.         */  

  50.     }  

  51.   

  52. }  

  53.   

  54. /******************************************************************************* 

  55. * Function Name  : Delay_Ms 

  56. * Description    : delay 1 ms. 

  57. * Input          : dly (ms) 

  58. * Output         : None 

  59. * Return         : None 

  60. *******************************************************************************/  

  61. void delay1ms(int t)  

  62. {  

  63.     //机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us  

  64.     int temp = 6000/4 ;  

  65.     while(t--)  

  66.     {  

  67.         while(temp--)  

  68.         { ; }     

  69.     }  

  70.   

  71. }  

  72.   

  73.   

  74. /******************************************************************************* 

  75. * Function Name  : RCC_Configuration 

  76. * Description    : Configures the different system clocks. 

  77. * Input          : None 

  78. * Output         : None 

  79. * Return         : None 

  80. *******************************************************************************/  

  81. void RCC_Configuration(void)  

  82. {  

  83.     //----------使用外部RC晶振-----------  

  84.     RCC_DeInit();           //初始化为缺省值  

  85.     RCC_HSEConfig(RCC_HSE_ON);  //使能外部的高速时钟   

  86.     while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪  

  87.       

  88.     //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer  

  89.     //FLASH_SetLatency(FLASH_Latency_2);        //Flash 2 wait state  

  90.       

  91.     RCC_HCLKConfig(RCC_SYSCLK_Div1);        //HCLK = SYSCLK  

  92.     RCC_PCLK2Config(RCC_HCLK_Div1);         //PCLK2 =  HCLK  

  93.     RCC_PCLK1Config(RCC_HCLK_Div2);         //PCLK1 = HCLK/2  

  94.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ  

  95.     RCC_PLLCmd(ENABLE);         //Enable PLLCLK  

  96.   

  97.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready  

  98.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //Select PLL as system clock  

  99.     while(RCC_GetSYSCLKSource()!=0x08);     //Wait till PLL is used as system clock source  

  100.       

  101.     //---------打开相应外设时钟--------------------  

  102.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能APB2外设的GPIOA的时钟   

  103.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    //使能APB2外设的GPIOC的时钟  

  104.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   

  105.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  

  106.       

  107.     //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);       

  108.            

  109. }  

  110.   

  111. /******************************************************************************* 

  112. * Function Name  : GPIO_Configuration 

  113. * Description    : 初始化GPIO外设 

  114. * Input          : None 

  115. * Output         : None 

  116. * Return         : None 

  117. *******************************************************************************/   

  118. void GPIO_Configuration(void)  

  119. {  

  120.   GPIO_InitTypeDef GPIO_InitStructure;  

  121.   

  122.   /* Configure USARTx_Tx as alternate function push-pull */  

  123.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  

  124.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  125.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  

  126.   GPIO_Init(GPIOA, &GPIO_InitStructure);  

  127.   

  128.   /* Configure USARTx_Rx as input floating */  

  129.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  

  130.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

  131.   GPIO_Init(GPIOA, &GPIO_InitStructure);  

  132.   

  133. }  

  134.   

  135. /******************************************************************************* 

  136. * Function Name  : USART_Configuration 

  137. * Description    : 初始化串口USART1(异步收发模式) 

  138. * Input          : BaudRate (要设置的波特率) 

  139. * Output         : None 

  140. * Return         : None 

  141. *******************************************************************************/   

  142. void USART_Configuration(u32 BaudRate)  

  143. {  

  144. //1、定义一个用于初始化USART的结构体  

  145.     USART_InitTypeDef USART_InitStructure;  

  146.        

  147. //2、给结构体元素赋值,设置 波特率、数据帧的位数、停止位的位数、奇偶校验位、硬件流控制位、USART模式(发送、接收)  

  148.     USART_InitStructure.USART_BaudRate = BaudRate;   

  149.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;   

  150.     USART_InitStructure.USART_StopBits = USART_StopBits_1;   

  151.     USART_InitStructure.USART_Parity = USART_Parity_No;   

  152.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   

  153.     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;    

  154.   

  155. //3、调用函数USART_Init();用上面的结构体值作为参数对USART1进行初始化  

  156.     USART_Init(USART1, &USART_InitStructure);  

  157.   

  158. //4、调用函数USART_Cmd();对USART1进行使能  

  159.     USART_Cmd(USART1, ENABLE);  

  160.   

  161. }  




程序运行前:



程序运行后:


关键字:STM32  串行通信  USART 引用地址:STM32 串行通信 USART 程序例举

上一篇:STM32通过调用库函数进行编程
下一篇:串行通信 软件仿真STM32与74LS164通信

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

stm32 接收蓝牙(uart)等设备命令的处理
方法有两种: 方法1:查询法 static void BT_RX_Handler(void) { u8 data = USART_ReceiveData(USART2); if((BT_Buf_Status & 0x80) == 0) /* not complete */ { if(BT_Buf_Status & 0x40) { BT_RcvBuf = data; BT_RecCur++; if((data == 0xEC) && (8 == BT_RecCur)) //if((data == 0xEC)) { BT_Buf_Status |= (1 7); /* comple
[单片机]
STM32 CAN控制器原理与配置
一。STM32 CAN控制器简介-bxCAN 什么是bxCAN:STM32自带了基本扩展CAN外设,又称bxCAN。 F103最多有14个过滤器组,F407有28个。 (二)STM32 CAN控制器的模式简介 工作模式:开始必须是初始化模式,对CAN进行初始化,然后是正常模式,可以正常的收发数据,通过CAN_MCR寄存器控制INRQ和SLEEP。睡吗模式是为了降低功耗用的。 测试模式:通过CAN_BTR寄存器控制LBKM和SILM位。 1. 静默模式: 静默模式下可以接收CANRX上的数据,但不会发送任何数据到CANTX上,一直等于1,也就是发送 隐形电平。 这么模式可以监控总线上面的数据。 2. 环回模式
[单片机]
<font color='red'>STM32</font> CAN控制器原理与配置
STM32的PWM极性和模式
初学STM32 本人还是菜鸟级选手,学习PWM这节一直困惑不解,对PWM的模式和极性搞不清楚。不久前,突然恍然大悟。众里寻他千百度,蓦然回首那人却在灯火阑珊处。 其实,想通了也很简单。再说PWM模式之前,我们要知道计数器CNT。比如在向上计数模式时CNT从0计数到设定的周期值。还有一个用来确定高低电平分割线的CCRx的寄存器。这样一来就可以知道PWM的周期有定时的周期值确定,高低占空比有CRRx值来确定。 PWM一共有两种模式,PWM1模式:CNT CRRx为有效电平。CNT CRRx为无效电平。PWM2模式相反。那么问题来了什么为有效电平?他又怎么确定 它是由TIM_OCInitStructure.TIM_OCPolarity
[单片机]
stm32.cube(二)——HAL结构及初始化
一、HAL结构 HAL的作用是将基础的寄存器读写操作抽象掉,使程序员只需要关心对芯片模块的行为级操作。stm32的cube包以类似面向对象的思想来进行设计,每一个芯片模块都被抽象成一个类,它的私有成员用以辅助算法的实现,公有成员被用作一个方法供外部调用。 我开发板的芯片型号是stm32f10x系列,基础的芯片结构如下: 这时官网上下载的cube包里hal内容: 对比之后发现几乎所有的模块都已经被包含进HAL层。 二、HAL的初始化 HAL层被调用前要先运行初始化函数HAL_init(),它包含在针对HAL自身的全局操作操作的源文件hal.c里。 HAL全局结构 由于Hal_init函数不长,就直接上原型了: HAL_
[单片机]
使用JTAG连接STM32 SWD模式 (STM32L011为例)
使用JLINK的JTAG接口连接STM32的SWD模式 近期使用STM32L011做产品,第一次接触SWD模式,之前都是使用JTAG接口进行下载仿真。初次使用,问题多多。现在将我遇到的问题,和解决办法贴出来,希望能够帮到后来人。 使用的软件 Keil 5 硬件芯片 STM32L011F4P6 连接器 J-LINK V9 1:KEIL 设置 这个比较简单,在DEBUG选项,选择使用J-LINK 然后点击settings,将port由JTAG 改为SW 如果连接成功,则会在SW Device栏显示信息。 2:连线 在使用JTAG连接SWD时,比较茫然,网上搜索一番,得到信息是JTAG完全胜任SW
[单片机]
使用JTAG连接<font color='red'>STM32</font> SWD模式 (STM32L011为例)
适合嵌入式stm32的五大操作系统解析
  基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。   1、μClinux   μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧
[单片机]
stm32 encoder
首先打开timer2的encoder模式: 配置系统时钟。 配置具体定时器的参数: 选择的encoderMode是 TI1和TI2模式。这种模式下,AB两相的上升沿和下降沿都会计数,所以计数值是实际值的4倍,需要做分频。也就是第一个参数,分频值设为3,实际上是3+1=4分频。 还有个地方需要解释一下,我刚开始的时候就是把这里的设置没搞清楚,看Polarity参数设置的是Rising Edge。这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检测AB相的上升沿,下降沿还是同样会计数的。 Input Filter滤波值是从1-15,看情况设定,是用来滤除一些杂波的。
[单片机]
<font color='red'>stm32</font> encoder
大联大友尚集团推出ST STM32 F4系列中的最小微控制器
2016年3月15日,致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下友尚推出ST STM32 F4系列中最小的微控制器---STM32F410,并同时搭配其最新开发板---NUCLEO-F410RB,以帮助客户实现尺寸更小,功耗更低且更高性能的产品。 大联大友尚代理的STM32F410搭载ARM Cortex -M4F处理器内核,在100MHz时指令周期可达125 DMIPS,并在EEMBC CoreMark 测试中取得339分的优异成绩。具有功耗意识(Power-conscious)的STM32 Dynamic Efficiency 特性,例如意法半导体的ART Accelerator 和电压调整,可
[单片机]
大联大友尚集团推出ST <font color='red'>STM32</font> F4系列中的最小微控制器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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