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

2、CMSIS标准:

3、STM32库函数的组织:

4、程序例举:

调用库函数实现通过USART发送数据(26个大写的英文字母)



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





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



  1. /**************************************************************************************************
  2. * 硬件平台:STM32F103VC
  3. * 学习重点:调用库函数来实现对USART的操作
  4. * 实现功能:软件仿真,实现STM32通过USART1发送数据
  5. * 作 者:赵小龙
  6. **************************************************************************************************/
  7.  
  8. /* Includes ------------------------------------------------------------------*/
  9. #include "stm32f10x_lib.h" //包括了全部的头文件 它是唯一一个用户须要包括在自己应用中的文件,起到应用和库之间界面的作用。
  10. #include "stm32f10x_map.h"
  11.  
  12. /*----------------函数声明部分---------------*/
  13. void delay1ms(int t) ;
  14. void RCC_Configuration(void) ;
  15. void GPIO_Configuration(void) ;
  16. void USART_Configuration(u32 BaudRate) ;
  17.  
  18. /* Private functions -----------------------------------------------------------------------------*/
  19. /**************************************************************************************************
  20. * Function Name : main
  21. * Description : 软件仿真,从USART1发送26个大写的英文字母
  22. * Input : None
  23. * Output : None
  24. * Return : None
  25. ****************************************************************************************************/
  26. int main(void)
  27. {
  28.  
  29. u8 i,data;
  30. /*--------配置开启系统时钟、配置USART1发送/接收使用的两个I/O口、配置USART1---------------------------------------------*/
  31. RCC_Configuration();
  32. GPIO_Configuration();
  33. USART_Configuration(19600);
  34.  
  35. /*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/
  36. data='A';
  37. for(i=0;i<26;i++)
  38. {
  39. USART_SendData(USART1, data) ;
  40. data++ ;
  41. while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;//发送完毕标志位为1时便是数据发送完毕。若为0时则应让程序等待(等待数据发送发送完毕)
  42. /*注意:这里最好不要依照下面形式书写,否则会出错。详细原因我暂且还不知道
  43. u8 status ;
  44. status = USART_GetFlagStatus(USART1, USART_FLAG_TC) ; //将查看状态寄存器的函数的返回值赋值给变量status
  45. while(status == RESET) ;
  46. */
  47. }
  48.  
  49. }
  50.  
  51. /*******************************************************************************
  52. * Function Name : Delay_Ms
  53. * Description : delay 1 ms.
  54. * Input : dly (ms)
  55. * Output : None
  56. * Return : None
  57. *******************************************************************************/
  58. void delay1ms(int t)
  59. {
  60. //机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us
  61. int temp = 6000/4 ;
  62. while(t--)
  63. {
  64. while(temp--)
  65. { ; }
  66. }
  67.  
  68. }
  69.  
  70. /*******************************************************************************
  71. * Function Name : RCC_Configuration
  72. * Description : Configures the different system clocks.
  73. * Input : None
  74. * Output : None
  75. * Return : None
  76. *******************************************************************************/
  77. void RCC_Configuration(void)
  78. {
  79. //----------使用外部RC晶振-----------
  80. RCC_DeInit(); //初始化为缺省值
  81. RCC_HSEConfig(RCC_HSE_ON); //使能外部的快速时钟
  82. while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部快速时钟使能就绪
  83.  
  84. //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
  85. //FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
  86.  
  87. RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
  88. RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
  89. RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
  90. RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
  91. RCC_PLLCmd(ENABLE); //Enable PLLCLK
  92.  
  93. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
  94. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
  95. while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
  96.  
  97. //---------打开对应外设时钟--------------------
  98. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟
  99. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能APB2外设的GPIOC的时钟
  100. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  101. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  102.  
  103. //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
  104.  
  105. }
  106.  
  107. /*******************************************************************************
  108. * Function Name : GPIO_Configuration
  109. * Description : 初始化GPIO外设
  110. * Input : None
  111. * Output : None
  112. * Return : None
  113. *******************************************************************************/
  114. void GPIO_Configuration(void)
  115. {
  116. GPIO_InitTypeDef GPIO_InitStructure;
  117.  
  118. /* Configure USARTx_Tx as alternate function push-pull */
  119. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  120. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  121. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  122. GPIO_Init(GPIOA, &GPIO_InitStructure);
  123.  
  124. /* Configure USARTx_Rx as input floating */
  125. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  126. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  127. GPIO_Init(GPIOA, &GPIO_InitStructure);
  128.  
  129. }
  130.  
  131. /*******************************************************************************
  132. * Function Name : USART_Configuration
  133. * Description : 初始化串口USART1(异步收发模式)
  134. * Input : BaudRate (要设置的波特率)
  135. * Output : None
  136. * Return : None
  137. *******************************************************************************/
  138. void USART_Configuration(u32 BaudRate)
  139. {
  140. //1、定义一个用于初始化USART的结构体
  141. USART_InitTypeDef USART_InitStructure;
  142.  
  143. //2、给结构体元素赋值。设置 波特率、数据帧的位数、停止位的位数、奇偶校验位、硬件流控制位、USART模式(发送、接收)
  144. USART_InitStructure.USART_BaudRate = BaudRate;
  145. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  146. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  147. USART_InitStructure.USART_Parity = USART_Parity_No;
  148. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  149. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  150.  
  151. //3、调用函数USART_Init();用上面的结构体值作为參数对USART1进行初始化
  152. USART_Init(USART1, &USART_InitStructure);
  153.  
  154. //4、调用函数USART_Cmd();对USART1进行使能
  155. USART_Cmd(USART1, ENABLE);
  156.  
  157. }

程序执行前:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29uMTIzNDU2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

程序执行后:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29uMTIzNDU2NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

STM32通过调用库函数进行编程的更多相关文章

  1. STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)

    数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...

  2. 不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数

    不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数. 这是一道面试题,可以使用递归的方式解答,答案如下: #include <stdio.h> int mylen(cha ...

  3. 使用C语言调用mysql数据库编程实战以及技巧

    今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...

  4. stm32 Flash读写[库函数]

    stm32 的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP特性使得开发人员对stm32可以警醒调试开发,可以通过JTAG和SWD接口对stm32进行程序烧写:支持IAP特性使得开发 ...

  5. linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令

    本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空 ...

  6. linux ltrace-跟踪进程调用库函数的情况

    当前位置:硬件 | 监测 | 内核 | Shell / 性能监测与优化 /ltrace ltrace命令是用来跟踪进程调用库函数的情况. 语法 ltrace [option ...] [command ...

  7. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

    strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...

  8. C语言调用库函数实现生产者消费者问题

    #include<stdio.h> #include<stdlib.h> #include<semaphore.h> #include<pthread.h&g ...

  9. STM32建立project库函数方法

    (1)打开keilMDK主界面能够看到project中有一个默认的project,点击这个project名字,然后选择菜单Project->Close Project,就关闭掉这个project ...

随机推荐

  1. 448. Find All Numbers Disappeared in an Array@python

    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...

  2. Yii1 获取当前请求的url

    echo Yii::app()->getRequest()->getUrl();

  3. 「 Luogu P2574 」 XOR的艺术——线段树

    # 解题思路 这题不难,但是原谅我一开始的傻逼想法,一会儿再给大家透露透露. 先说怎么做这题. 显然对于 $0$ 和 $1$ 来说,异或无非也就只有两种变化 异或了奇数次,$0$ 就会变成 $1$,$ ...

  4. Mysql+MHA高可用集群

    http://www.ttlsa.com/mysql/step-one-by-one-deploy-mysql-mha-cluster/

  5. Servlet+JSP教程之:第一个Web程序

    我们知道当浏览器发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理.逻辑代 码是由程序员自己编写然后放进服务器进行运行,其实就是Servlet程序. 第一个Web程序: 开发工具: My ...

  6. C语言学习12

    希尔排序 //希尔排序 #include <stdio.h> void main() { ], i; int shell(int a[], int n); printf("请输入 ...

  7. SQLServer__问题记录

    “备份集中的数据库备份与现有的xx数据库不同”  参考链接: http://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html RESTOR ...

  8. LR性能测试问题解决方法

    一.Error -27727: Step download timeout (120 seconds)has expired when downloading resource(s). Set the ...

  9. 【置换】G. Poker 2.0

    https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/G [题意] 题意很简单,就是“鸽尾式”洗扑克,问洗m次各张牌的位置 [思路] 牌 ...

  10. hdu 3940

    #include<stdio.h> #include<math.h> #include<string.h> double first(double vx,doubl ...