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

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

2、CMSIS标准:

3、STM32库函数的组织:

4、程序例举:

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

首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对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);

}

程序运行前:

程序运行后:

STM32通过调用库函数进行编程,布布扣,bubuko.com

时间: 2024-08-08 07:26:16

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

常用的字符串处理函数实现(不调用库函数)

描述:C语言中对于字符串类型并未定义,但存在许多有关字符串的库函数(如:strstr(在原串中匹配子串),strcpy(将原串内容拷贝到目标串中),strcmp(比较两个字符串的内容),strcat(连接两个字符串,亦为字符串的追加),strlen(求取字符串的长度)....),我们可以自己编写程序实现以上功能的函数,而不调用库函数,,,再对照库函数进行学习,有利于提高自身的编程能力. //1.strcat函数(连接两个字符串,亦为字符串的追加) #include<stdio.h> #incl

stm32 Flash读写[库函数]

一. stm32的FLASH分为 1.主存储块:用于保存具体的程序代码和用户数据,主存储块是以页为单位划分的, 一页大小为1KB.范围为从地址0x08000000开始的128KB内. 2.信息块   :用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区 二.操作原则 对Flash 的写入操作要 "先擦除后写入"的原则: stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非

stm32之GPIO库函数开发

关于GPIO库函数的重点函数:P122 GPIO_Init() :根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器: GPIO_ReadInputDataBit():读取指定端口管脚的输入: GPIO_SetBits():设置指定的数据端口位: GPIO_ResetBits(): 清除指定的数据端口位: GPIO_PinRemapConfig(): 改变指定管脚的映射:----------端口映射是很有特色的功能:也是重点知识 GPIO_EXTILineConfig():

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

本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核. 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件.

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

今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_real_connect,原型例如以下: MYSQL * STDCALL mysql_real_connect( MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned

STM32通用定时器库函数设置

通用定时器 STM32的通用定时器为:TIM2.TIM3.TIM4和TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1.使能定时器TIM_X的时钟:(X=2.3.4.5) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE); 2.计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下: 系统时钟(一般为72MHZ) = 定时器分频数 * 计数值 假如分频数为7200,则定时器时钟为:72MHZ/7

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

strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行所消耗的时间等,是高级运维和开发人员排查问题的杀手铜. strace命令的参数选项及说明 -c 统计每一个系统调用所执行的时间.次数和出错的次数等 -d 输出strace关于标准错误的调试信息 -f 跟踪目标进程,以及目标进程创建的所有子进程 -ff 如果提供-o filename,则将所有进程的跟

java gc的调用机制 和编程规则

一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能.本文将从GC的工作原理.GC的几个关键问题进行探讨,最后提出一些Java程序设计建议,如何从GC角度提高Java程序的性能. GC的基本原理        GC是什么? 为什么要有GC呢?     GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的

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

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<semaphore.h> 4 #include<pthread.h> 5 #include<unistd.h> 6 7 #define NumOf_Producer 5 //the max num of producer 8 #define NumOf_Consumer 10 //the max num of consumer 9 #defin