完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
总体分为中断函数和主函数,
主函数实现: /****************************************************************************** * 文件名 : main.c * 作者 : Losingamong * 时间 : 08/08/2008 * 文件描述 : 主函数 ******************************************************************************/ #include "stm32f10x_lib.h" #define BUFFERMAX 256 static u8 UsartBuffer[BUFFERMAX]; static u8 BufferWptr = 0; static u8 BufferRptr = 0; static void RCC_Configuration(void); static void USART1_Configuration(void); static void USART2_Configuration(void); static void NVIC_Configuration(void); static u8 BufferRead(u8* data); /* * 函数名 : main * 函数描述 : Main 函数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 */ int main(void) { u8 data = 0; u8 i = 0; RCC_Configuration(); USART1_Configuration(); USART2_Configuration(); NVIC_Configuration(); while(1) { if(BufferRead(&data)) { USART_SendData(USART2, data); for(i = 0; i < 10; i++); /* 加短延时降低数据处理速度 */ } } } /* * 函数名 : BufferWrite * 函数描述 : 缓冲区写函数(由串口接收中断服务调用) * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 */ void BufferWrite(void) { if(BufferWptr == (BufferRptr - 1)) { return; } UsartBuffer[BufferWptr] = USART_ReceiveData(USART1); BufferWptr++; BufferWptr = BufferWptr % BUFFERMAX; } /* * 函数名 : BufferRead * 函数描述 : 缓冲区读函 * 输入参数 : data,待存放读出数据的内存空间地址 * 输出结果 : 无 * 返回值 : 0:无数据 1:有数据 */ u8 BufferRead(u8* data) { if(BufferRptr == BufferWptr) { return 0; } *data = UsartBuffer[BufferRptr]; BufferRptr++; BufferRptr = BufferRptr % BUFFERMAX; return 1; } /* 函数名 : RCC_Configuration * 函数描述 : 设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 */ void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */ ErrorStatus HSEStartUpStatus; /* 复位系统时钟设置*/ RCC_DeInit(); /* 开启HSE*/ RCC_HSEConfig(RCC_HSE_ON); /* 等待HSE起振并稳定*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 判断HSE起是否振成功,是则进入if()内部 */ if(HSEStartUpStatus == SUCCESS) { /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */ RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* 设置FLASH延时周期数为2 */ FLASH_SetLatency(FLASH_Latency_2); /* 使能FLASH预取缓存 */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 使能PLL */ RCC_PLLCmd(ENABLE); /* 等待PLL输出稳定 */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 选择SYSCLK时钟源为PLL */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 等待PLL成为SYSCLK时钟源 */ while(RCC_GetSYSCLKSource() != 0x08); } } /* * 函数名 : USART1_Configuration * 函数描述 : 设置USART1 * 输入参数 : None * 输出结果 : None * 返回值 : None */ void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); 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; USART_Init(USART1 , &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1 , ENABLE); } /* * 函数名 : USART2_Configuration * 函数描述 : 设置USART2 * 输入参数 : None * 输出结果 : None * 返回值 : None */ void USART2_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); 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; USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); } /* * 函数名 : NVIC_Configuration * 函数描述 : 设置NVIC参数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 */ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
/* * 函数名 : USART1_IRQHandler * 函数描述 : USART1中断服务函数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 */ void USART1_IRQHandler(void) { /* 判断ORE位是否为SET状态 */ if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) { /* 进行空读操作,目的是清除ORE位 */ USART_ReceiveData(USART1); } if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { /* 将接收到的数据写入缓冲 */ BufferWrite(); USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:06 , Processed in 0.843709 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号