STM32--串口源程序
来源:互联网 发布:足球打水软件多少钱 编辑:程序博客网 时间:2024/05/22 14:05
STM32的串口使用起来非常简单,有三种方法:查询、中断、DMA,由于版主只用过前两种,并且DMA方法配置起来并不困难,故在此只贴出查询和中断的源代码,标注非常详细,只需做相应修改即可。
1、程序源代码(查询)
功能藐视:串口调试助手HEX输出55
#include "stm32f10x.h"
#include "stm32f10x_it.h"
extern uint32_t g_Timer2_num;
/* Private function prototypes -----------------------------------------------*/
void DelayMs(uint32_t ms);
void Tim_1ms_Interrupt_Config(void);
void COM_Config(void);
/* Private functions ---------------------------------------------------------*/
int main(void)
{
SystemInit(); //系统时间配置
Tim_1ms_Interrupt_Config();//1ms定时中断配置
COM_Config(); //串口配置
while(1)
{
USART_SendData(USART1, 0x55);
DelayMs(500);
}
}
void DelayMs(uint32_t ms)
{
while(g_Timer2_num != ms);
g_Timer2_num = 0;
}
void Tim_1ms_Interrupt_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_DeInit(TIM2);
/*36MHz的APB1,由于APB1是AHB的分频,所以时钟是APB1的2倍频,即为72MHz,故1ms为72MHz*1ms = 72000,即计数周期为
预分频周期为0-71和普通计数周期为0-999。*/
TIM_TimeBaseStructure.TIM_Period = (1000-1);
TIM_TimeBaseStructure.TIM_Prescaler = (72-1);
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void COM_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStruct;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用开漏输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
USART_InitStructure.USART_BaudRate = 115200;//速率115200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
/* Configure USART1 */
USART_Init(USART1, &USART_InitStructure);//配置串口参数函数
/* Enable USART1 Receive and Transmit interrupts */
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能发送缓冲空中断
//USART_ITConfig(USART1, USART_IT_TC, ENABLE); //使能发送完成中断
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
2、程序源代码(中断)
功能描述:系统复位输出字符b
#include "stm32f10x.h"
#include "stdio.h"
/* Private function prototypes -----------------------------------------------*/
void RCC_Config(void);
void GPIO_Config(void);
void NVIC_Config(void);
void USART_Config(void);
int main(void)
{
RCC_Config();
GPIO_Config();
NVIC_Config();
USART_Config();
USART_ClearFlag(USART1,USART_FLAG_TC);
while(1)
{}
}
void RCC_Config(void)
{
{
ErrorStatus HSEStartUpStatus; // 定义错误状态变量
RCC_DeInit(); //初始化RCC
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS) //等待外部晶振打开
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //如果外部晶振就绪,设置AHB时钟为系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1) ; //设置高速时钟APB2为72MHz
RCC_PCLK1Config(RCC_HCLK_Div2) ; //设置低速时钟APB1为系统时钟2分频
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH代码延时
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能预取指缓存
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟,为外部时钟的9倍频
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL准备就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL为系统时钟
while(RCC_GetSYSCLKSource() != 0x08); //判断PLL是否为系统时钟
}
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
/* Configure USART1 Tx (PA.09) 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 USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //4位用作指定响应优先级
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART_Config(void)
{ USART_InitTypeDef USART_InitStructure;
USART_StructInit(&USART_InitStructure);
// USART_ClockInitTypeDef USART_ClockInitStructure;//定义串口模式初始化结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
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_Rx | USART_Mode_Tx;
/* Configure USART1 */
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口接收中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能串口发送中断
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
/* 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,
而TXE=1,表明发送数据寄存器为空, TC=1表明发送已完成
两句使能中断,也就是说当TXE=1就会进入中断,所以程序初始化后就能进入中断*/
}
在stm32f10x_it.c中,我们找到函数void USART1_IRQHandler(),向其添加代码
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_SendData(USART1, 'b');
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
- STM32--串口源程序
- STM32串口接收不定长数据原理与源程序
- STM32串口接收不定长数据原理与源程序
- STM32串口接收不定长数据原理与源程序
- STM32串口使用IDLE中断接收不定长数据原理与源程序
- STM32 flash读写源程序
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手源程序
- STM32串口
- stm32串口
- stm32-串口
- 【STM32】STM32之串口
- 串口调试助手源程序(1)
- 串口调试助手源程序VC++
- STM32 串口通讯
- 求最小值
- 面试基础知识整理
- 《深入理解Linux网络内幕》学习笔记一:内核通知链
- 有些话,那么悲伤,那么简短_伤感唯美日志
- 求球的表面积
- STM32--串口源程序
- C#删除字符串中的空格
- SQL 三表连接查询
- Tomcat server配置文件相关说明.
- 包含类的c++程序
- Linux 2.6 内核中的最新电源管理技术综述
- (转载)环形缓冲区的实现原理(ring buffer) .
- UML图的学习总结
- 线程池