STM8L串口中断

如何让串口接受到中断?这里是串口部分的配置,这里复用的串口(PA2和PA3),不是使用默认串口

	// 1使能时钟
	CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);
	// 2配置引脚上拉 这里是将A2 A3作为串口,所以复用
	GPIO_Init(GPIOA,GPIO_Pin_2,GPIO_Mode_Out_PP_High_Fast);
	GPIO_Init(GPIOA,GPIO_Pin_3,GPIO_Mode_In_FL_No_IT);
	GPIO_ExternalPullUpConfig(GPIOA,GPIO_Pin_2,ENABLE);
	GPIO_ExternalPullUpConfig(GPIOA,GPIO_Pin_3,ENABLE);

	SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);

	// 3配置波特率
	USART_Init(USART1, (uint32_t)9600, USART_WordLength_8b,USART_StopBits_1, USART_Parity_No, USART_Mode_Rx|USART_Mode_Tx);
	
	// 4配置接受中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	// 5配置itc中断管理,中断优先级2
	ITC_SetSoftwarePriority(USART1_RX_IRQn,ITC_PriorityLevel_2);
	// 6启动串口
	USART_Cmd(USART1,ENABLE);

配置完成后,还要使用enableInterrupts()函数使能全局中断,这步很关键,常常配完了串口,忘记这一步中断就进不去。

另外发现有的itc.h头文件不一样,我的是这样的

/**
  ******************************************************************************
  * @file    Project/STM8L15x_StdPeriph_Template/stm8l15x_it.h
  * @author  MCD Application Team
  * @version V1.6.1
  * @date    30-September-2014
  * @brief   This file contains the headers of the interrupt handlers.
  ******************************************************************************
  * @attention
  *
  * 

© COPYRIGHT 2014 STMicroelectronics

* * 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. * ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM8L15x_IT_H #define __STM8L15x_IT_H /* Includes ------------------------------------------------------------------*/ #include "stm8l15x.h" /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ #ifdef _COSMIC_ void _stext(void); /* RESET startup routine */ INTERRUPT void NonHandledInterrupt(void); #endif /* _COSMIC_ */ #ifndef _RAISONANCE_ INTERRUPT void TRAP_IRQHandler(void); /* TRAP */ INTERRUPT void FLASH_IRQHandler(void); /* FLASH EOP/PG_DIS */ INTERRUPT void DMA1_CHANNEL0_1_IRQHandler(void); /* DMA1 Channel0/1*/ INTERRUPT void DMA1_CHANNEL2_3_IRQHandler(void); /*DMA1 Channel2/3*/ INTERRUPT void RTC_CSSLSE_IRQHandler(void); /* RTC /CSS_LSE */ INTERRUPT void EXTIE_F_PVD_IRQHandler(void); /*EXTI PORTE/EXTI PORTF/PVD*/ INTERRUPT void EXTIB_G_IRQHandler(void); /* EXTI PORTB / EXTI PORTG */ INTERRUPT void EXTID_H_IRQHandler(void); /* EXTI PORTD / EXTI PORTH*/ INTERRUPT void EXTI0_IRQHandler(void); /* EXTI PIN0 */ INTERRUPT void EXTI1_IRQHandler(void); /* EXTI PIN1 */ INTERRUPT void EXTI2_IRQHandler(void); /* EXTI PIN2 */ INTERRUPT void EXTI3_IRQHandler(void); /* EXTI PIN3 */ INTERRUPT void EXTI4_IRQHandler(void); /* EXTI PIN4 */ INTERRUPT void EXTI5_IRQHandler(void); /* EXTI PIN5 */ INTERRUPT void EXTI6_IRQHandler(void); /* EXTI PIN6 */ INTERRUPT void EXTI7_IRQHandler(void); /* EXTI PIN7 */ INTERRUPT void LCD_AES_IRQHandler(void); /* LCD /AES */ INTERRUPT void SWITCH_CSS_BREAK_DAC_IRQHandler(void); /* Switch CLK/CSS/TIM1 Break/DAC */ INTERRUPT void ADC1_COMP_IRQHandler(void); /*ADC1/COMP*/ INTERRUPT void TIM2_UPD_OVF_TRG_BRK_USART2_TX_IRQHandler(void); /* TIM2 UPD/OVF/TRG/BRK / USART2 TX */ INTERRUPT void TIM2_CC_USART2_RX_IRQHandler(void); /* TIM2 CAP / USART2 RX */ INTERRUPT void TIM3_UPD_OVF_TRG_BRK_USART3_TX_IRQHandler(void); /* TIM3 UPD/OVF/TRG/BRK /USART3 TX*/ INTERRUPT void TIM3_CC_USART3_RX_IRQHandler(void); /* TIM3 CAP/ USART3 RX */ INTERRUPT void TIM1_UPD_OVF_TRG_COM_IRQHandler(void);/* TIM1 UPD/OVF/TRG/COM */ INTERRUPT void TIM1_CC_IRQHandler(void);/* TIM1 CAP*/ INTERRUPT void TIM4_UPD_OVF_TRG_IRQHandler(void); /* TIM4 UPD/OVF/TRI */ INTERRUPT void SPI1_IRQHandler(void); /* SPI1 */ INTERRUPT void USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler(void); /* USART1 TX / TIM5 UPD/OVF/TRG/BRK */ INTERRUPT void USART1_RX_TIM5_CC_IRQHandler(void); /* USART1 RX / TIM5 CAP */ INTERRUPT void I2C1_SPI2_IRQHandler(void); /* I2C1 / SPI2 */ #endif /* _RAISONANCE_ */ #endif /* __STM8L15x_IT_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

最后是中断服务函数,粗心大意的认为27号中断是接受中断,后面偶然发现28号才是接受中断,眼睛都看花了。

INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler,27)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
}
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
  if(SET == USART_GetITStatus(USART1,USART_IT_RXNE))
  {
    usart_rec_buf[usart_rec_index++] = USART1->DR;
    if(usart_rec_index >= sizeof(usart_rec_buf))
    {
      usart_rec_index = 0;
    }
    USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);
    
  }
}

 

你可能感兴趣的:(STM8L串口中断)