我用的是官方USART中的HyperTerminal_Interrupt文件夹里的例子程序,对程序做了一些修改,我要用的是USART1,tx是PA9,rx是PA10,对原来stm32f2xg_eval.c和stm32f2xg_eval.h中的宏定义和函数针对的不同做了修改,可是现在用串口调试助手还是看不到数据。 硬件平台:stm32f205 ide环境:iar ewarm6.3 仿真器:jlink V8 固件库:stm32f2xx v1.1.0 请各路大虾帮忙看看我的程序是否正确? /** ****************************************************************************** * @file USART/HyperTerminal_Interrupt/main.c * @author MCD Application Team * @version V1.1.0 * @date 13-April-2012 * @brief Main program body ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f2xx.h" //#include "stm322xg_eval.h" /** @addtogroup STM32F2xx_StdPeriph_Examples * @{ */ /** @addtogroup USART_HyperTerminal_Interrupt * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ USART_InitTypeDef USART_InitStructure; extern uint8_t NbrOfDataToTransfer; extern uint8_t NbrOfDataToRead; extern __IO uint8_t TxCounter; extern __IO uint16_t RxCounter; /* Private function prototypes -----------------------------------------------*/ void NVIC_Config(void); void RCC_Config(void); void GPIO_Config(void); /* Private functions ---------------------------------------------------------*/ /** * @brief Main program * @param None * @retval None */ void RCC_Config(void) { SystemInit(); ErrorStatus HSEStartUpStatus;//定义错误状态变量 RCC_DeInit();//将RCC寄存器重新设置为默认值 RCC_HSEConfig(RCC_HSE_ON);//打开外部高速时钟晶振 HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟晶振工作 if(HSEStartUpStatus == SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)为系统时钟 RCC_PCLK2Config(RCC_HCLK_Div2);//设置高速AHB时钟(APB2)为HCLK的2分频 RCC_PCLK1Config(RCC_HCLK_Div4);//设置低速AHB时钟(APB1)为HCLK时钟 FLASH_SetLatency(FLASH_Latency_3); FLASH_PrefetchBufferCmd(ENABLE); FLASH_InstructionCacheCmd(ENABLE); FLASH_DataCacheCmd(ENABLE); RCC_PLLConfig(RCC_PLLSource_HSE, 12,240,2,5);//设置PLL时钟 RCC_PLLCmd(ENABLE);//使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL准备就绪 {} RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源 while(RCC_GetSYSCLKSource() != RCC_CFGR_SWS_PLL);//判断PLL是否是系统时钟 {} } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Connect PXx to USARTx_Tx*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); /* Connect PXx to USARTx_Rx*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); /* Configure USART Tx as alternate function */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART Rx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); /* USART configuration */ USART_Init(USART1, &USART_InitStructure); /* Enable USART */ USART_Cmd(USART1, ENABLE); } int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f2xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f2xx.c file */ RCC_Config(); /* NVIC configuration */ NVIC_Config(); /* USARTx configuration ------------------------------------------------------*/ /* USARTx configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - Two Stop Bit - Odd parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_2; USART_InitStructure.USART_Parity = USART_Parity_Odd; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; GPIO_Config(); /* Enable the EVAL_COM1 Transmit interrupt: this interrupt is generated when the EVAL_COM1 transmit data register is empty */ USART_ITConfig(USART1, USART_IT_TXE, ENABLE); /* Wait until EVAL_COM1 send the TxBuffer */ while(TxCounter < NbrOfDataToTransfer) {} /* The software must wait until TC=1. The TC flag remains cleared during all data transfers and it is set by hardware at the last frame抯 end of transmission*/ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} /* Enable the EVAL_COM1 Receive interrupt: this interrupt is generated when the EVAL_COM1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Wait until EVAL_COM1 receive the RxBuffer */ while(RxCounter < NbrOfDataToRead) {} while (1) { } } /** * @brief Configures the nested vectored interrupt controller. * @param None * @retval None */ void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx 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); } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 下面是stm32f2xx_it.c中的 /** ****************************************************************************** * @file USART/HyperTerminal_Interrupt/stm32f2xx_it.c * @author MCD Application Team * @version V1.1.0 * @date 13-April-2012 * @brief Main Interrupt Service Routines. * This file provides template for all exceptions handler and peripherals * interrupt service routine. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f2xx_it.h" //#include "stm322xg_eval.h" /** @addtogroup STM32F2xx_StdPeriph_Examples * @{ */ /** @addtogroup USART_HyperTerminal_Interrupt * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define USARTx_IRQHANDLER USART1_IRQHandler #define TXBUFFERSIZE (countof(TxBuffer) - 1) #define RXBUFFERSIZE 0x20 /* Private macro -------------------------------------------------------------*/ #define countof(a) (sizeof(a) / sizeof(*(a))) /* Private variables ---------------------------------------------------------*/ uint8_t TxBuffer[] = "\n\rUSART Hyperterminal Interrupts Example: USART-Hyperterminal\ communication using Interrupt\n\r"; uint8_t RxBuffer[RXBUFFERSIZE]; uint8_t NbrOfDataToTransfer = TXBUFFERSIZE; uint8_t NbrOfDataToRead = RXBUFFERSIZE; __IO uint8_t TxCounter = 0; __IO uint16_t RxCounter = 0; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /******************************************************************************/ /* Cortex-M3 Processor Exceptions Handlers */ /******************************************************************************/ /** * @brief This function handles NMI exception. * @param None * @retval None */ void NMI_Handler(void) { } /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } /** * @brief This function handles Memory Manage exception. * @param None * @retval None */ void MemManage_Handler(void) { /* Go to infinite loop when Memory Manage exception occurs */ while (1) { } } /** * @brief This function handles Bus Fault exception. * @param None * @retval None */ void BusFault_Handler(void) { /* Go to infinite loop when Bus Fault exception occurs */ while (1) { } } /** * @brief This function handles Usage Fault exception. * @param None * @retval None */ void UsageFault_Handler(void) { /* Go to infinite loop when Usage Fault exception occurs */ while (1) { } } /** * @brief This function handles SVCall exception. * @param None * @retval None */ void SVC_Handler(void) { } /** * @brief This function handles Debug Monitor exception. * @param None * @retval None */ void DebugMon_Handler(void) { } /** * @brief This function handles PendSV_Handler exception. * @param None * @retval None */ void PendSV_Handler(void) { } /** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { } /******************************************************************************/ /* STM32F2xx Peripherals Interrupt Handlers */ /******************************************************************************/ /** * @brief This function handles USARTx global interrupt request. * @param None * @retval None */ void USARTx_IRQHANDLER(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { /* Read one byte from the receive data register */ RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x7F); if(RxCounter == NbrOfDataToRead) { /* Disable the EVAL_COM1 Receive interrupt */ USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); } } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { /* Write one byte to the transmit data register */ USART_SendData(USART1, TxBuffer[TxCounter++]); if(TxCounter == NbrOfDataToTransfer) { /* Disable the EVAL_COM1 Transmit interrupt */ USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } } /******************************************************************************/ /* STM32F2xx Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ /* available peripheral interrupt handler's name please refer to the startup */ /* file (startup_stm32f2xx.s). */ /******************************************************************************/ /** * @brief This function handles PPP interrupt request. * @param None * @retval None */ /*void PPP_IRQHandler(void) { }*/ /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|