zoukankan      html  css  js  c++  java
  • STM32通过调用库函数进行编程

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


    2、CMSIS标准:



    3、STM32库函数的组织:



    4、程序例举:

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


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




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



    /**************************************************************************************************
     *	硬件平台:STM32F103VC
     *	学习重点:调用库函数来实现对USART的操作
     *	实现功能:软件仿真,实现STM32通过USART1发送数据
     *	作    者:赵小龙
     **************************************************************************************************/
    
    
    /* Includes ------------------------------------------------------------------*/
    #include "stm32f10x_lib.h"	  //包括了全部的头文件 它是唯一一个用户须要包括在自己应用中的文件,起到应用和库之间界面的作用。
    #include "stm32f10x_map.h"
    
    
    /*----------------函数声明部分---------------*/
    void delay1ms(int t) ;
    void RCC_Configuration(void) ;
    void GPIO_Configuration(void) ;
    void USART_Configuration(u32 BaudRate) ;
    
    
    /* Private functions -----------------------------------------------------------------------------*/ 
    /**************************************************************************************************
    * Function Name  : main
    * Description    : 软件仿真,从USART1发送26个大写的英文字母
    * Input          : None
    * Output         : None
    * Return         : None
    ****************************************************************************************************/
    int main(void)
    {
    
    	u8 i,data;	
    /*--------配置开启系统时钟、配置USART1发送/接收使用的两个I/O口、配置USART1---------------------------------------------*/
    	RCC_Configuration();
    	GPIO_Configuration();
    	USART_Configuration(19600);
    
    /*--------发送一串字符‘A’--‘Z’到USART1的DR-----------------------------------------------------------------------------*/
    	data='A';
    	for(i=0;i<26;i++)
    	{
    		USART_SendData(USART1, data) ;
    		data++ ;
    		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ;//发送完毕标志位为1时便是数据发送完毕。若为0时则应让程序等待(等待数据发送发送完毕)
    		/*注意:这里最好不要依照下面形式书写,否则会出错。详细原因我暂且还不知道
    			u8 status ; 
    			status = USART_GetFlagStatus(USART1, USART_FLAG_TC) ;  //将查看状态寄存器的函数的返回值赋值给变量status 
    			while(status == RESET) ;
    		*/
    	}
    
    }
    
    /*******************************************************************************
    * Function Name  : Delay_Ms
    * Description    : delay 1 ms.
    * Input          : dly (ms)
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void delay1ms(int t)
    {
    	//机器周期T = 1/(72000000/12)s = 1/6000000 s = 1/6 us
    	int temp = 6000/4 ;
    	while(t--)
    	{
    		while(temp--)
    		{ ; }	
    	}
    
    }
    
    
    /*******************************************************************************
    * Function Name  : RCC_Configuration
    * Description    : Configures the different system clocks.
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    void RCC_Configuration(void)
    {
    	//----------使用外部RC晶振-----------
    	RCC_DeInit();			//初始化为缺省值
    	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的快速时钟 
    	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部快速时钟使能就绪
    	
    	//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
    	//FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
    	
    	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
    	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
    	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
    	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ
    	RCC_PLLCmd(ENABLE);			//Enable PLLCLK
    
    	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
    	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
    	
    	//---------打开对应外设时钟--------------------
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能APB2外设的GPIOA的时钟	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//使能APB2外设的GPIOC的时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    	
    	//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);	 
    		 
    }
    
    /*******************************************************************************
    * Function Name  : GPIO_Configuration
    * Description    : 初始化GPIO外设
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/ 
    void GPIO_Configuration(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;
    
      /* Configure USARTx_Tx as alternate function push-pull */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    
      /* Configure USARTx_Rx as input floating */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    }
    
    /*******************************************************************************
    * Function Name  : USART_Configuration
    * Description    : 初始化串口USART1(异步收发模式)
    * Input          : BaudRate (要设置的波特率)
    * Output         : None
    * Return         : None
    *******************************************************************************/ 
    void USART_Configuration(u32 BaudRate)
    {
    //1、定义一个用于初始化USART的结构体
    	USART_InitTypeDef USART_InitStructure;
    	 
    //2、给结构体元素赋值。设置 波特率、数据帧的位数、停止位的位数、奇偶校验位、硬件流控制位、USART模式(发送、接收)
    	USART_InitStructure.USART_BaudRate = BaudRate; 
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
    	USART_InitStructure.USART_StopBits = USART_StopBits_1; 
    	USART_InitStructure.USART_Parity = USART_Parity_No; 
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  
    
    //3、调用函数USART_Init();用上面的结构体值作为參数对USART1进行初始化
    	USART_Init(USART1, &USART_InitStructure);
    
    //4、调用函数USART_Cmd();对USART1进行使能
    	USART_Cmd(USART1, ENABLE);
    
    }
    
    


    程序执行前:


    程序执行后:


  • 相关阅读:
    [转载]很完整的2、8、10、16进制转换方法
    [转载]C++星号的含义
    [转载]C++星号的含义
    [转载]麦凯66表格
    [转载]js入门·对象属性方法大总结
    [转载]图解《越狱》中纸玫瑰的折法
    [转载]比较开始日期与结束日期的js方法
    Cannot set device tcp segmentation offload settings: Invalid argument
    记一次薪酬谈判的教训
    TCP拥塞状态机的实现(中)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7161367.html
Copyright © 2011-2022 走看看