STM32 구덩이 메우기: 시계는 외부 장치를 초기화하기 전에

3797 단어 STM32
최근 STM32에 직렬 통신 프로그램을 썼지만 다운로드를 받은 후 직렬 통신이 작동하지 않습니다. 초기화된 코드는 다음과 같습니다.
//  /   GPIO、            
GPIO_InitTypeDef GPIO_InitStructureTx;
GPIO_InitTypeDef GPIO_InitStructureRx;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
	
//         
GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructureRx.GPIO_Pin = GPIO_Pin_10;
//           、           
GPIO_InitStructureTx.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//        
GPIO_InitStructureRx.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureTx.GPIO_Speed = GPIO_Speed_50MHz;
//     
GPIO_Init(GPIOA, &GPIO_InitStructureTx);
GPIO_Init(GPIOA, &GPIO_InitStructureRx);
		
//   
USART_InitStructure.USART_BaudRate = 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;
//     1
USART_Init(USART1, &USART_InitStructure);

//    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//       
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
//     
NVIC_Init(&NVIC_InitStructure);

//  1  
USART_Cmd(USART1, ENABLE);

//    1    
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

보시다시피 외부 시계는 GPIO와 USART를 초기화한 후에 놓을 수 있습니다.인터넷에서 자료를 찾아보니 STM32 외부 장치가 작동하지 않은 상황에서 외부 장치의 레지스터가 설정될 수 없다는 것을 발견하였다.설명 참조:
"ARM의 칩은 외부 장치가 시계를 준 후에야 레지스터를 설정할 수 있다(즉 이 외부 장치를 사용할 수 있다).STM32, LPC1XXX 등은 모두 이렇다. 이렇게 하는 목적은 전기를 절약하기 위해 이른바 시계문 제어 기술을 사용했다.레지스터는 트리거를 기반으로 한다. 트리거의 값은 반드시 시계가 필요하다. 레지스터의 시계는 버스 시계가 제공한다. 즉, 버스 시계가 없으면 레지스터 값을 읽어주지 않는다는 것이다."
따라서 GPIO와 USART를 초기화하기 전에 외부 시계를 놓아 이 문제를 해결했고 최종 코드는 다음과 같다.
//  /   GPIO、            
GPIO_InitTypeDef GPIO_InitStructureTx;
GPIO_InitTypeDef GPIO_InitStructureRx;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

//    (      GPIO USART     )
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//         
GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructureRx.GPIO_Pin = GPIO_Pin_10;
//           、           
GPIO_InitStructureTx.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//        
GPIO_InitStructureRx.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureTx.GPIO_Speed = GPIO_Speed_50MHz;
//     
GPIO_Init(GPIOA, &GPIO_InitStructureTx);
GPIO_Init(GPIOA, &GPIO_InitStructureRx);
		
//   
USART_InitStructure.USART_BaudRate = 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;
//     1
USART_Init(USART1, &USART_InitStructure);


//       
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
//     
NVIC_Init(&NVIC_InitStructure);

//  1  
USART_Cmd(USART1, ENABLE);

//    1    
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 
 

좋은 웹페이지 즐겨찾기