STM32通过调用库函数进行编程

发布者:见贤思奇异果最新更新时间:2017-09-18 来源: eefocus关键字:STM32  调用库函数  编程 手机看文章 扫描二维码
随时随地手机看文章

1、调用库函数编程和直接配置寄存器编程的区别:


2、CMSIS标准:



3、STM32库函数的组织:



4、程序例举:

调用库函数实现通过USART发送数据(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  调用库函数  编程 引用地址:STM32通过调用库函数进行编程

上一篇:STM32串行通信USART讲解笔记
下一篇:STM32 串行通信 USART 程序例举

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

STM32 USB OTG官方库移植
实ST公司的官方usb库已经做得很不错了。只是一开始不会用,导致浪费了很多时间。 首先拿到库,需要确认板上的端口资源。 VBUS D- D+ GND 四条线至少要有,但是VBUS不一定要接在芯片端口上。作为从机的话VBUS可以直接拉高到3v以上。电流大小待确认。D-,D+一定要接到芯片的OTG FS HS均可 DM DP对应 D- D+。作为主机可以不接VBUS,也可将VBUS接到芯片端口作为检测口,此处不明是硬件原因还是什么原因,若使用VBUS检测的话,拔掉usb线会造成JLINK崩溃,因此我将VBUS口作为普通I/O口,查询读取是否连接或失去连接。 OTG_HS想用的话需要外接PHY,若无外接PHY,也将HS口配置成FS口。
[单片机]
STM32通用定时器库函数设置
通用定时器 STM32的通用定时器为:TIM2、TIM3、TIM4和TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1.使能定时器TIM_X的时钟:(X=2、3、4、5) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE); 2.计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下: 系统时钟(一般为72MHZ) =定时器分频数 * 计数值 假如分频数为7200,则定时器时钟为:72MHZ/7200=10KHZ,定时器每次计数时间间隔为1/10000秒,假如定时1秒,则要计数10000次,因此计数器的最大计数值为9999
[单片机]
STM32中RCC时钟简介
LEGEND(说明) HSE = Hight-speed external clock singal HSI = Hight-speed internal clock singal LSI = Low-speed external clock singal LSE = Low-speed internal clock singal HSE 为外部高速外部晶振 (4~16M HSE OSC,推荐为 8 M 的OSC ) HSI 为高速内部晶振 (8 M 的HSE OSC) LSI 为低速内部晶振 (在30kHz和60kHz之间) -------LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机
[单片机]
毕业设计| STM32+TI BQ76940设计48V BMS方案
这是根据TI官方那个方案改:精确监测和 50μA 待机电流、13S、48V 锂离子电池组参考设计TIDA-010030,链接如下: https://www. ti.com.cn/tool/cn/TIDA- 010030#technicaldocuments 原方案里的MCU用的是TI自家的MSP430,由于没用过,我自己改成了STM32F103C8T6。 除了电量计这块没有进行充放电学习过程外,基本实现要求功能,自定义的过流,短路,过放,过温都行。可以自动识别充放电,充电过程进行电池均衡(这里设置了一节),防充电器倒冲(程序存在BUG我最后只做到了10V,如果一上来就低于10V就不管用了),CAN总线传输数据也整上了。BQ7
[单片机]
毕业设计| STM32+TI BQ76940设计48V BMS方案
stm32_ps2键盘显示测试程序
//PS2键盘测试程序,可换行,按shift不放接着输入 //可输出大写,按下CAPS输出大写,再次按下输出小写 //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减 //PA13- PS2.CLK PA15- PS2.DATA #include #include sys.h #include usart.h #include delay.h #include led.h #include key.h #include exti.h #include wdg.h #include timer.h #i
[单片机]
基于STM32的FSMC接口驱动TFT彩屏的设计方案
  TFT-LCD技术是微电子技术和LCD技术巧妙结合的高新技术。随着人们对图像清晰度、刷新率、保真度的要求越来越高,TFT-LCD的应用范围越来越广。本文提出了一种能直接驱动数字液晶屏的设计方案,方案先介绍了TFT数字彩屏的工作原理,利用STM32处理器的FSMC接口设计的硬件电路和软件程序均能对显示控制芯片进行有效的控制。在实际应用中显示清晰流畅,并且CPU有足够的时间来处理用户程序。该方案能成功应用在电脑横机的人机界面显示中,且其硬件电路结构简单、控制方式灵活、对于其他型号的接口芯片也能提供参考。   0 引言   随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上
[单片机]
基于<font color='red'>STM32</font>的FSMC接口驱动TFT彩屏的设计方案
stm32 fsmc 功能讲解
LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。 WR为0,RD为1(表示是写动
[单片机]
自学PLC编程步骤分享
科学的PLC编程步骤其实很简单,但往往大多数工程师就是认为简单而忽略很多细节。细节的忽略,必然会在以后出现问题。想避免日后的问题,只有好好的遵守规则,没有规矩不成方圆,plc编程一样有其自身的规矩。(仅供参考) 第一步看起来再简单不过了,但很多工程师都做不到。认为这一步是浪费时间,甚至只从供货方培训来了解设备。 仔细阅读说明书是编程的第一步,首先要阅读安全守则,知道哪些执行机构可能会对人身造成伤害,哪些机构间最容易发生撞击,当发生危险时如何解决,这些最致命的问题都在安全守则中,为什么不去看呢? 此外,关于设备每个元件的特性,使用方法,调试方法也在说明书中,不去阅读,即使程序正确,如果元件没有调试好,设备一样不能工作。再
[嵌入式]
自学PLC<font color='red'>编程</font>步骤分享
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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