历史上的今天
今天是:2024年09月01日(星期日)
2018年09月01日 | STM32库函数实现USART发送数据
2018-09-01 来源:eefocus
参考文件:STM32固件库使用手册的中文翻译版.pdf
如图1
我们先把USART初始化函数添加到主函数,如图二
包括Baudrate,Word Length,Stop Bit,Parity,Hardware Flow Control(硬件流控制),Usart Mode;UE使能,使能串口外设,如图3
3.串口初始化,串口外设使能之后,就要发送数据了如图4;
4.发送完成标志位函数,如图5;
程序1 实现功能代码如下
/************************************************
刘凯教你学STM32F103
第20讲
软件仿真,库函数实现USART数据发送
2016年4月24日 10:12:39
程序实现1
**************************************************/
#include "sys.h"
#include "delay.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
int main(void)
{
u8 i,data;
USART_InitTypeDef USART_InitStructure;
RCC_Configuration();
GPIO_Configuration();
USART_InitStructure.USART_BaudRate = 9600;
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;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1,ENABLE);
data = 'A';
for(i=0;i<30;i++)
{
USART_SendData(USART1, data);
data++;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}
void RCC_Configuration(void)
{
/*---------------使用外部RC晶振----------*/
RCC_DeInit(); //设置时钟为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部高速晶振
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE准备就绪
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预取
FLASH_SetLatency(FLASH_Latency_2); //等待2个周期
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 = 72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //SYSCLK = PLLCLK
while(RCC_GetSYSCLKSource()!= 0x08); //Wait PLLCLK as system clock
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器
}
对上面代码进行优化
/************************************************
刘凯教你学STM32F103
第20讲
软件仿真,库函数实现USART数据发送
2016年4月24日 10:12:39
程序实现2 对程序1进行优化
**************************************************/
#include "sys.h"
#include "delay.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(u32 Baudrate);
int main(void)
{
u8 i,data;
RCC_Configuration();
GPIO_Configuration();
USART_Configuration(9600);
data = 'A';
for(i=0;i<30;i++)
{
USART_SendData(USART1, data);
data++;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}
void RCC_Configuration(void)
{
/*---------------使用外部RC晶振----------*/
RCC_DeInit(); //设置时钟为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部高速晶振
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);//等待HSE准备就绪
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能指令预取
FLASH_SetLatency(FLASH_Latency_2); //等待2个周期
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 = 72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //SYSCLK = PLLCLK
while(RCC_GetSYSCLKSource()!= 0x08); //Wait PLLCLK as system clock
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA寄存器
}
void USART_Configuration(u32 Baudrate)
{
USART_InitTypeDef USART_InitStructure;
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;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 电子竞赛参赛选手应该知道的十一个网站整理了十个我常用的网站。现在通过互联网跟大家分享: 6个中文网站: 1 http://bbs.21ic.com/ 老牌专业的电子论坛,尽管坛子中多了很大调侃之人,但是其专 ...… 查看全部问答> |
|
求教: 我是wince和硬件的新手,自己做了一块板子,现在网口老出问题。网口没有焊在板子上,只是拉了六个线出来;下载系统时,用tptf32给板子分配IP。 问题一:我在wince5.0下向ep9315开发板下载系统,常连接不上。在t ...… 查看全部问答> |
|
Fatutil.dll和formatdisk.h这两个文件谁能给我发一下吗?邮箱是nanxi.su@tidever.com.cn 我安的是STANDARDSDK_420,安装目录下只发现了Fatutil.h这个文件,没有找到Fatutil.dll和formatdisk.h,哪位大虾有的话帮我发一下好吗?我想用FormatVolume函数格式化磁盘。… 查看全部问答> |
|
用commondialog控件保存文件问题,知道的进来看看,帮帮忙,指导一下 Private Sub Command3_Click() CommonDialog1.CancelError = True On Error GoTo errhandler CommonDialog1.Filter = \"All Files(*.*)|*.*|Text Files(*.txt)|*.txt\" CommonDialog1.FilterIndex = 2 CommonDialog1.ShowSave Open CommonDia ...… 查看全部问答> |
|
最近很忙,忙开会哈,这个很重要的行业会,当然与单片机无关,呵呵。。。。今天有空发个调式好的小程序,可以评估5种功耗模式的耗电。 程序简单就是利用25板的按键按一下一个模式。究竟怎么个功耗法本人没 ...… 查看全部问答> |
|
问题现象描述:在使用STM32VET6串口1,中断接收到数据后立即返回接收到的数据。用上位机串口 调试助手发送数据,一个字节一个字节(例如一次只发0x55)发送,上位机可以正确接收 数据(0x55)。但是如果一次发多个数据(例如发送0x55 0x66 0x77) ...… 查看全部问答> |




