完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们去翻阅官方资料,可以发现CW32的管脚的功能是可以重定义的。同样的功能,可以体现在不同的 管脚上面。 今天,我们来初步探讨一下串口1的操作。 板上给我们单独提供串口1,管脚是PA9---RX,PA10---TX。然而,我们看数据手册,却发现一个问题: PA10上面数据手册中的管脚定义并没有给我们提示PA10可以复用为TX。这在STM32F103上面是可以的。 到底什么原因,也许只有厂家知道了。 我们,还是选择PA8和PA9来做串口1的输入输出管脚。 串口1驱动头文件: #ifndef __UART1__H__ #define __UART1__H__ #include "main.h" #define USART_DEBUG_EN 1 //UARTx #define DEBUG_USARTx CW_UART1 #define DEBUG_USART_CLK RCC_APB2_PERIPH_UART1 #define DEBUG_USART_APBClkENx RCC_APBPeriphClk_Enable2 #define DEBUG_USART_BaudRate 9600 #define DEBUG_USART_UclkFreq 64000000 //UARTx GPIO #define DEBUG_USART_GPIO_CLK RCC_AHB_PERIPH_GPIOA #define DEBUG_USART_TX_GPIO_PORT CW_GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_PIN_8 #define DEBUG_USART_RX_GPIO_PORT CW_GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_PIN_9 //GPIO AF #define DEBUG_USART_AFTX PA08_AFx_UART1TXD() #define DEBUG_USART_AFRX PA09_AFx_UART1RXD() //中断 #define DEBUG_USART_IRQ UART1_IRQn extern void UART1_Configuration( void ); extern void USART_SendString( UART_TypeDef* USARTx, char *String ); extern void USART1_SendBuf( uint8_t *pBuf, uint16_t u16Len ); extern void USART1_SendOneByte( uint8_t Byte ); extern void u1_printf( char* fmt, ... ); // 串口1打印函数 #endif 串口1驱动文件: #include "uart1.h" void UART1_Configuration( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //UART TX RX 复用 DEBUG_USART_AFTX; DEBUG_USART_AFRX; //外设时钟使能 RCC_AHBPeriphClk_Enable( DEBUG_USART_GPIO_CLK, ENABLE ); DEBUG_USART_APBClkENx( DEBUG_USART_CLK, ENABLE ); GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN; // IO管脚初始化配置 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init( DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure ); GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN; // IO管脚初始化配置 GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; GPIO_Init( DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure ); USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate; // 串口模式初始化配置 USART_InitStructure.USART_Over = USART_Over_16; USART_InitStructure.USART_Source = USART_Source_PCLK; USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq; USART_InitStructure.USART_StartBit = USART_StartBit_FE; 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 ); //使能UARTx RC中断 USART_ITConfig( DEBUG_USARTx, USART_IT_RC, ENABLE ); } /** * @Brief 发送字符串 * * @param USARTx :USARTx外设 * 参数可以是: * CW_UART1、CW_UART2、CW_UART3 * @param String :待发送的字符串 */ void USART_SendString( UART_TypeDef* USARTx, char *String ) { while( *String != '\0' ) { USART_SendData_8bit( USARTx, *String ); while( USART_GetFlagStatus( USARTx, USART_FLAG_TXE ) == RESET ); String++; } while( USART_GetFlagStatus( USARTx, USART_FLAG_TXBUSY ) == SET ); } //============================================================================= //文件名称: //功能概要:USART1发送函数 //参数说明:第一个参数为待放的数据缓冲区,第二个变量为数据长度 //函数返回:无 //============================================================================= void USART1_SendBuf( uint8_t *pBuf, uint16_t u16Len ) { while( u16Len-- ) { while( USART_GetFlagStatus( CW_UART1, USART_FLAG_TXE ) == RESET ); USART_SendData_8bit( CW_UART1, *pBuf++ ); } while( USART_GetFlagStatus( CW_UART1, USART_FLAG_TXBUSY ) == SET ); } //============================================================================= //文件名称: //功能概要:USART1发送一个字节函数 //参数说明:第一个参数为待发送的数据 //函数返回:无 //============================================================================= void USART1_SendOneByte( uint8_t Byte ) { USART_SendData_8bit( CW_UART1, Byte ); while( USART_GetFlagStatus( CW_UART1, USART_FLAG_TXE ) == RESET ); while( USART_GetFlagStatus( CW_UART1, USART_FLAG_TXBUSY ) == SET ); } /** * @brief This funcation handles UART1 */ void UART1_IRQHandler( void ) { /* USER CODE BEGIN */ uint8_t TxRxBuffer; if( USART_GetITStatus( CW_UART1, USART_IT_RC ) != RESET ) { TxRxBuffer = USART_ReceiveData_8bit( CW_UART1 ); USART_SendData_8bit( CW_UART1, TxRxBuffer ); USART_ClearITPendingBit( CW_UART1, USART_IT_RC ); } /* USER CODE END */ } ///**********发送一个字符串********************/ void uart1_putc( char c ) { USART1_SendOneByte(c); } void uart1_puts( char *s ) { while ( *s ) uart1_putc( *s++ ); } __align( 8 ) uint8_t USART1_TX_BUF[255]; // 串口接收缓存区 //串口1,printf 函数 //确保一次发送数据不超过USART1_DATA_NUMBERS字节 使用方法同printf void u1_printf( char* fmt, ... ) { #if USART_DEBUG_EN va_list ap; va_start( ap, fmt ); vsprintf( ( char* )USART1_TX_BUF, fmt, ap ); va_end( ap ); uart1_puts( ( char* )USART1_TX_BUF ); #endif while( USART_GetFlagStatus( CW_UART1, USART_FLAG_TC ) == RESET ); } 这里实现了串口1的初始化,发送,中断接收和Printf打印映射功能。中断接收里面,收一个字节再发送一个 字节,实现自发自收的功能。 由于,开启了中断节省功能,我们还需去把中断打开。 void NVIC_Configuration( void ) { __disable_irq(); NVIC_EnableIRQ( GTIM1_IRQn ); NVIC_EnableIRQ( BTIM2_IRQn ); //优先级,无优先级分组 NVIC_SetPriority( DEBUG_USART_IRQ, 0 ); //UARTx中断使能 NVIC_EnableIRQ( DEBUG_USART_IRQ ); __enable_irq(); } 我们来看一下主函数实现那功能: 上电开启串口1打印功能。 u1_printf( "\r\n CW32饭盒派开发板测试 OK\r\n" ); 用串口 助手,我们来直观的观看打印信息。 就这样,我们实现了串口1的收发功能,在后面的程序中,我们可以用它来调试,打印程序的一些信息。 最后,上传整个工程文件,希望大家能找找BUG,共同进步。
02、串口探讨.zip
(845.74 KB, 下载次数: 0
)
|
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
CW32L010安全低功耗MCU,树立M0+产品行业新标杆!
785 浏览 0 评论
892 浏览 0 评论
1331 浏览 0 评论
1224 浏览 0 评论
962 浏览 0 评论
2468浏览 1评论
1005浏览 1评论
【CW32饭盒派开发板试用体验】与CW32饭盒派的第一次亲密接触
382浏览 1评论
261浏览 0评论
398浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 09:06 , Processed in 0.758293 second(s), Total 64, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号