完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
|
|
相关推荐
2个回答
|
|
一、 编程要点
USART: 1) 使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟; 2) 初始化 GPIO,并将 GPIO 复用到 USART 上; 3) 配置 USART 参数; 4) 配置中断控制器并使能 USART 接收中断; 5) 使能 USART; 6) 在 USART 接收中断服务函数实现数据接收和发送。 二、使用步骤 1.理解原理图 代码如下: : STM32F103ZET6 串口引脚位PA9 : STM32F103ZET6 输出口为PB5低电平点有效 : STM32F103ZET6 Key检测脚为PA8 2.建立USART串口的 头文件 USART_book.h 代码如下(示例): #ifndef __USART_BOOK_H_ #define __USART_BOOK_H_ #include "stm32f10x.h" #include "stm32f10x_usart.h" #include "stm32f10x_rcc.h" //串口的宏定义 不同的串口挂在的总线和IO不一样 //串口1 #define _DEBUG_USARTx USART1 #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define _DEBUG_USART_BAUDRATE 115200 // USART GPIO 引脚定义 #define _DEBUG_USART_GPIO_CLK RCC_APB2Periph_GPIOA #define _DEBUG_USART_GPIO_APBxCLKCmd RCC_APB2PeriphClockCmd #define _DEBUG_USART_TX_GPIO_PORT GPIOA #define _DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define _DEBUG_USART_TX_GPIO_MODE GPIO_Mode_AF_PP #define _DEBUG_USART_RX_GPIO_PORT GPIOA #define _DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define _DEBUG_USART_RX_GPIO_MODE GPIO_Mode_IN_FLOATING #define _DEBUG_NVIC_USART_IRQ USART1_IRQn #define _DRBUG_USART_IRQHandler USART1_IRQHandler void fn_USART_IO_Config(void); void fn_USART_Config(void); void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ); void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str); void Usart_SendHalf_32_Word( USART_TypeDef * pUSARTx, uint32_t ch); void _DRBUG_USART_IRQHandler(void); #endif 3.建立USART串口的 头文件 USART_book.c 代码如下(示例): #include "USART_book.h" /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * #define _DEBUG_NVIC_USART_IRQ USART1_IRQn * #define _DRBUG_NVIC_USART_IRQHandler USART1_IRQHandler * @retval *************************************************************/ static void NVIC_Configuration(void){ NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制寄存器组选择*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置 USART 为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = _DEBUG_NVIC_USART_IRQ; /* 抢断优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置 NVIC */ NVIC_Init(&NVIC_InitStructure); } /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * // USART GPIO 引脚定义 * #define _DEBUG_USART_GPIO_CLK RCC_APB2Periph_GPIOA * #define _DEBUG_USART_GPIO_APBxCLKCmd RCC_APB2PeriphClockCmd * * #define _DEBUG_USART_TX_GPIO_PORT GPIOA * #define _DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 * #define _DEBUG_USART_TX_GPIO_MODE GPIO_Mode_AF_PP * #define _DEBUG_USART_RX_GPIO_PORT GPIOA * #define _DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 * #define _DEBUG_USART_RX_GPIO_MODE GPIO_Mode_AF_FLOATING * @retval *************************************************************/ void fn_USART_IO_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; // 打开串口 GPIO 的时钟 _DEBUG_USART_GPIO_APBxCLKCmd(_DEBUG_USART_GPIO_CLK , ENABLE); //将USART TX 的GPIO配置为推挽模式 GPIO_InitStructure.GPIO_Pin = _DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = _DEBUG_USART_TX_GPIO_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(_DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure); //将USART RX 的GPIO配置为浮空输入 GPIO_InitStructure.GPIO_Pin = _DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = _DEBUG_USART_RX_GPIO_MODE; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(_DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure); } /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_USART_Config(void){ USART_InitTypeDef USART_InitStructure; // 打开串口外设的时钟 _DEBUG_USART_APBxClkCmd(_DEBUG_USART_CLK , ENABLE); //配置串口的工作参数 USART_InitStructure.USART_BaudRate = _DEBUG_USART_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_Rx | USART_Mode_Tx ; // 配置工作模式,收发一起 USART_Init(_DEBUG_USARTx , &USART_InitStructure);// 完成串口的初始化配置 NVIC_Configuration();// 串口中断优先级配置 USART_ITConfig(_DEBUG_USARTx , USART_IT_RXNE , ENABLE);// 使能串口接收中断 USART_Cmd(_DEBUG_USARTx , ENABLE);// 使能串口 } /************************************************************** * @brief * void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_Usart_Send_Byte(USART_TypeDef * pUSARTx , uint8_t ch ){ /*发送一个字节数据到USART*/ USART_SendData(pUSARTx , ch); /*等待发送数据寄存器为空*/ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET); } /************************************************************** * @brief * void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str); * @param * //串口1 * #define _DEBUG_USARTx USART1 * #define _DEBUG_USART_CLK RCC_APB2Periph_USART1 * #define _DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd * #define _DEBUG_USART_BAUDRATE 115200 * @retval *************************************************************/ void fn_Usart_SendString(USART_TypeDef *pUSARTx , char * str){ unsigned int k = 0; do{ fn_Usart_Send_Byte(pUSARTx,*(str + k++)); }while(*(str + k)!=' '); /*等待发送完成*/ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)); } /************************************************************** * @brief * void Usart_SendHalf_32_Word( USART_TypeDef * pUSARTx, uint32_t ch); * @param * @retval *************************************************************/ void Usart_SendHalf_32_Word( USART_TypeDef * pUSARTx, uint32_t ch){ uint32_t temp_Half32; uint8_t temp_Half=0,i_Half=4; temp_Half32 =ch; while(i_Half-->0){ temp_Half=(temp_Half32 & 0xFF000000)>>24; temp_Half32<<=8; fn_Usart_Send_Byte(pUSARTx,temp_Half); } /*等待发送完成*/ while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)); } /************************************************************** * @brief * void USART1_IRQHandler(void); * @param * @retval *************************************************************/ void _DRBUG_USART_IRQHandler(void){ uint8_t ucTemp = 0; if(USART_GetITStatus(_DEBUG_USARTx,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(_DEBUG_USARTx); USART_SendData(_DEBUG_USARTx ,ucTemp ); } } |
|
|
|
4.利用之前的LED输出的 头文件 Led_book.h
代码如下(示例): #ifndef __LED_BOOK_H_ #define __LED_BOOK_H_ #include "stm32f10x.h" #define LED_OUT_GPIO_Port GPIOB //GPIO Point #define LED_OUT_GPIO_Clock RCC_APB2Periph_GPIOB //GPIO clock #define LED_OUT_GPIO_Pin GPIO_Pin_5 #define LED_OUT_GPIO_Pin_Bit 5 #define LED_OUT_GPIO_Modle GPIO_Mode_Out_PP typedef enum { LED_Corporate_On = 1, LED_Corporate_OFF = 2, LED_Corporate_Toggle = 3, } LED_Corporate_state_t; void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef); void fn_Led_Init(void); void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , LED_Corporate_state_t _LED_Corporate_state_t ); #define __LED_Change__ fn_LED_Corporate(LED_OUT_GPIO_Port,LED_OUT_GPIO_Pin,LED_Corporate_Toggle) #endif 5.利用之前的LED输出的 头文件 Led_book.c 代码如下(示例): #include "Led_book.h" /************************************************************** * @brief * void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock , * uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef); * @param * @retval *************************************************************/ #define LED_GPIO_Speed GPIO_Speed_10MHz void fn_LED_GPIO_Config(GPIO_TypeDef* _GPIO_x , uint32_t _GPIO_Clock ,uint16_t _GPIO_Pin_x , GPIOMode_TypeDef _GPIOMode_TypeDef){ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = _GPIOMode_TypeDef; GPIO_InitStruct.GPIO_Pin = _GPIO_Pin_x; GPIO_InitStruct.GPIO_Speed = LED_GPIO_Speed; RCC_APB2PeriphClockCmd(_GPIO_Clock ,ENABLE); GPIO_Init(_GPIO_x , &GPIO_InitStruct) ; GPIO_SetBits(_GPIO_x,_GPIO_Pin_x); } /************************************************************** * @brief * void fn_Led_Init(void); * @param * @retval *************************************************************/ void fn_Led_Init(void){ fn_LED_GPIO_Config (LED_OUT_GPIO_Port,LED_OUT_GPIO_Clock,LED_OUT_GPIO_Pin,LED_OUT_GPIO_Modle); } /************************************************************** * @brief * void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , * LED_Corporate_state_t _LED_Corporate_state_t ); * @param * @retval *************************************************************/ void fn_LED_Corporate(GPIO_TypeDef* _GPIO_x , uint16_t _GPIO_Pin_x , LED_Corporate_state_t _LED_Corporate_state_t ){ switch(_LED_Corporate_state_t){ case LED_Corporate_On : GPIO_SetBits(_GPIO_x,_GPIO_Pin_x); break; case LED_Corporate_OFF: GPIO_ResetBits(_GPIO_x,_GPIO_Pin_x); break; case LED_Corporate_Toggle: GPIO_ReadOutputDataBit(_GPIO_x,_GPIO_Pin_x)?GPIO_ResetBits(_GPIO_x,_GPIO_Pin_x):GPIO_SetBits(_GPIO_x,_GPIO_Pin_x); break; } } //practice //fn_LED_GPIO_Config (LED_OUT_GPIO_Port,LED_OUT_GPIO_Clock,LED_OUT_GPIO_Pin,LED_OUT_GPIO_Modle); // while(1){ // delay(10000); // fn_LED_Corporate(LED_OUT_GPIO_Port,LED_OUT_GPIO_Pin,LED_Corporate_Toggle); // } 6.建立USART 输出的 主程序 main.c 代码如下(示例): /** ****************************************************************************** * @file GPIO/JTAG_Remap/main.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main program body ****************************************************************************** * @attention * * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "PROJ_book.h" /* Private functions ---------------------------------------------------------*/ /** * @brief Main program. * @param None * @retval None */ void delay(int x); void fn_LED_Flash_Init(void); void fn_usart_show_Init(void); int main(void) { fn_Led_Init(); fn_LED_Flash_Init(); fn_usart_show_Init(); fn_EXTI_GPIO_Config(); while(1){ delay(10000); fn_Usart_SendString(_DEBUG_USARTx," : 你瞅啥 n"); } } void fn_LED_Flash_Init(void){ uint16_t count_Init = 2; while(count_Init-->0){ __LED_Change__; fn_Systick_Delay(500,_Systick_ms); __LED_Change__; fn_Systick_Delay(100,_Systick_ms); __LED_Change__; fn_Systick_Delay(100,_Systick_ms); __LED_Change__; fn_Systick_Delay(500,_Systick_ms); } } void fn_usart_show_Init(void){ fn_USART_IO_Config(); fn_USART_Config(); fn_Usart_Send_Byte(_DEBUG_USARTx,'T'); fn_Usart_Send_Byte(_DEBUG_USARTx,'O'); Usart_SendHalf_32_Word(_DEBUG_USARTx,0xA69B4B7C); fn_Usart_SendString(_DEBUG_USARTx," : 你瞅啥 n"); } void delay(int x){ int y = 0xFFFFF; while((x--)>0){ while((y--)>0){ __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } } } /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ |
|
|
|
只有小组成员才能发言,加入小组>>
3156 浏览9 评论
2846 浏览16 评论
3354 浏览1 评论
8748 浏览16 评论
3952 浏览18 评论
9575浏览3评论
918浏览3评论
472浏览2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
473浏览2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2195浏览2评论
小黑屋|手机版|Archiver|德赢Vwin官网(湘ICP备2023018690号)
GMT+8, 2024-9-1 04:08, Processed in 1.001180 second(s), Total 79, Slave 61 queries .
Powered by德赢Vwin官网 网
© 2015bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191