STM32 구덩이 메우기: 시계는 외부 장치를 초기화하기 전에
3797 단어 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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (11) I2C를 사용해 보자 4 Si7020+ssd1306편STM32CubeIDE를 사용해 보자 How To STM32CubeIDE 일본어판 (10) I2C를 사용해 보자 3 ssd1306편의 계속입니다. Nucleo 보드와 Si7020, SSD1306을 연결합니다. 이번에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.