Сб фев 03, 2024 10:02:35
//Выше по коду включен тактирование порта А
void ADC1_Init(void) {
SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); //Настроили тактирование PORT A
//свой код
}
void USART1_Init(void) {
// USART1: Rx - PA10 , Tx - PA9
// PA9 (TxD)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b01 << GPIO_PUPDR_PUPDR9_Pos); // (01) подтяжка к плюсу питания или pull-up сокращено PU
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4)
// PA10 (RxD)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b10 << GPIO_MODER_MODER10_Pos); // (10) режим альтернативной функции
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b00 << GPIO_PUPDR_PUPDR10_Pos); //(00) состояние после сброса, no pull up, pull down
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4)
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); //Запустим тактирование USART1
USART1->BRR = 0xEA6; //19200
CLEAR_BIT(USART1->CR1, USART_CR1_OVER8); //0: Передискретизация равна 16
SET_BIT(USART1->CR1, USART_CR1_UE); //(1)USART включить
MODIFY_REG(USART1->CR1, USART_CR1_M_Msk, 0b00 << USART_CR1_M_Pos); //(00) Word lenght 1 Start bit, 8 Data bits, n Stop bit
SET_BIT(USART1->CR1, USART_CR1_RE); //(1) Влючить приемник Rx
SET_BIT(USART1->CR1, USART_CR1_TE); //(1) Включить передатчик Tx
SET_BIT(USART1->CR1, USART_CR1_RXNEIE); //(1) Прерывание по приему данных включено
SET_BIT(USART1->CR1, USART_CR1_IDLEIE); //(1) Прерывание по флагу IDLE включено
USART1->CR2 = 0;
CLEAR_BIT(USART1->CR2, USART_CR2_STOP); //1 стоп бит
USART1->CR3 = 0;
USART1->GTPR = 0;
USART1->ICR = 0;
NVIC_EnableIRQ(USART1_IRQn);
}
// PA10 (RxD) shall use the alternate function 7 (see data sheet)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b00 << GPIO_MODER_MODER10_Pos); //(00) вход
Сб фев 03, 2024 11:27:05
Сб фев 03, 2024 13:48:28
// USART1: Rx - PA10 , Tx - PA9
// PA9 (TxD) shall use the alternate function 7 (see data sheet)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b00 << GPIO_PUPDR_PUPDR9_Pos); // (00) без подтяжки
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4)
// PA10 (RxD) shall use the alternate function 7 (see data sheet)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b00 << GPIO_MODER_MODER10_Pos); //(00) input
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b01 << GPIO_PUPDR_PUPDR10_Pos); //(01) подтяжка к плюсу питания или pull-up сокращено PU
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4)
Сб фев 03, 2024 14:01:56
Сб фев 03, 2024 14:26:38
// USART1: Rx - PA10 , Tx - PA9
// PA9 (TxD) shall use the alternate function 7 (see data sheet)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // (10) режим альтернативной функции
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b00 << GPIO_PUPDR_PUPDR9_Pos); // (00) сброс
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR9_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH1_Msk, 0b0111 << GPIO_AFRH_AFRH1_Pos); // 7 << (1 * 4)
// PA10 (RxD) shall use the alternate function 7 (see data sheet)
MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b10 << GPIO_MODER_MODER10_Pos); //(10) режим альтернативной функции
CLEAR_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); //(0) двухтактный выход или push-pull сокращено PP
MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b01 << GPIO_PUPDR_PUPDR10_Pos); //(01) PU
MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDER_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDER_OSPEEDR10_Pos); //(11) 50 MHz, высокочастотный выход
MODIFY_REG(GPIOA->AFR[1], GPIO_AFRH_AFRH2_Msk, 0b0111 << GPIO_AFRH_AFRH2_Pos); // 7 << (2 * 4)
void USART1_IRQHandler(void) {
if (READ_BIT(USART1->ISR, USART_ISR_RXNE)) {
//RXNE - Сбрасывается автоматически при чтении регистра RDR. Также можно сбросить записью в этот бит нуля.
//Если пришли данные по USART
husart1.rx_buffer[husart1.rx_counter] = USART1->RDR; //Считаем данные в соответствующую ячейку в rx_buffer
husart1.rx_counter++; //Увеличим счетчик принятых байт на 1
}
if (READ_BIT(USART1->ISR, USART_ISR_IDLE)) {
//Если прилетел флаг IDLE
USART1->RDR; //Сбросим флаг IDLE
husart1.rx_len = husart1.rx_counter; //Узнаем, сколько байт получили
CMSIS_USART_Transmit(USART1, husart1.rx_buffer, husart1.rx_counter); //Отправим в порт то, что прилетело для проверки.
husart1.rx_counter = 0; //сбросим счетчик приходящих данных
}
}
void CMSIS_USART_Transmit(USART_TypeDef *USART, uint8_t *data, uint16_t Size) {
for (uint16_t i = 0; i < Size; i++) {
while (READ_BIT(USART->ISR, USART_ISR_TXE) == 0) ; //Ждем, пока линия не освободится
USART->TDR = *data++; //Кидаем данные
}
}
Вс фев 04, 2024 00:34:09
Вс фев 04, 2024 07:55:10
Вс фев 04, 2024 09:25:59
void CMSIS_RCC_SystemClock_72MHz(void) {
//Настройка 72MHz
SET_BIT(RCC->CR, RCC_CR_HSION); //(1)Запустили внутрений RC генератор на 8 MHz
while (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0); //Дождемся поднятия флага о готовности
CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); //(0)
SET_BIT(RCC->CR, RCC_CR_HSEON);//(1) //Запустим внешний кварцевый резонатор на 8 MHz
while (READ_BIT(RCC->CR, RCC_CR_HSEON) == 0); //Дождемся поднятия флага о готовности
//SET_BIT(RCC->CR, RCC_CR_CSSON); //(1)Вкл. CSS
CLEAR_BIT(RCC->CR, RCC_CR_CSSON); //(0)Выкл .CSS
MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, FLASH_ACR_LATENCY_1); //(010) Two wait states, if 48 MHz < SYSCLK <= 72 MHz
SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); //(1) Prefetch is enabled
SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBS); //(1) Prefetch buffer is enabled
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL); //(10)Выберем PLL в качестве System Clock
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1); //(0)AHB Prescaler /1
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV2); //(100) APB1 Prescaler /2, т.к. PCLK1 max 36MHz
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV1); //(0) APB2 Prescaler /1. 72MHz.
MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC, RCC_CFGR_PLLSRC_HSE_PREDIV); //(10) В качестве входного сигнала для PLL выберем HSE
MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV_Msk, 0b0000 << RCC_CFGR2_PREDIV_Pos); //(0000) PREDIV коэффициент деления PREDIV.
MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLXTPRE, RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV1); //(0000) HSE input to PLL not divided предделение перед PLL /1
MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL, RCC_CFGR_PLLMUL9); //(0111) т.к. кварц на 8Mhz, а нужно 72MHz
CLEAR_BIT(RCC->CFGR, RCC_CFGR_USBPRE); //(1) OFF или (0) Для USB 72MHz/1.5 = 48MHz
SET_BIT(RCC->CR, RCC_CR_PLLON); //PLL Вкл.
while (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0);//Дождемся поднятия флага о готовности PLL
}
Вс фев 04, 2024 09:54:17
Вс фев 04, 2024 10:06:37
SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); //Настроили тактирование PORT A
Вс фев 04, 2024 10:34:25
Вс фев 04, 2024 10:48:16
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); //Запустим тактирование USART1
Вс фев 04, 2024 11:02:48
Вс фев 04, 2024 15:35:48
Вс фев 04, 2024 17:41:44
Вс фев 04, 2024 17:45:00
Вс фев 04, 2024 18:30:44
if (READ_BIT(USART1->ISR, USART_ISR_IDLE)) {
//Если прилетел флаг IDLE
USART1->RDR; //Сбросим флаг IDLE
husart1.rx_len = husart1.rx_counter; //Узнаем, сколько байт получили
CMSIS_USART_Transmit(USART1, husart1.rx_buffer, husart1.rx_counter); //Отправим в порт то, что прилетело для проверки.
husart1.rx_counter = 0; //сбросим счетчик приходящих данных
}
Вс фев 04, 2024 18:49:17
Вс фев 04, 2024 18:59:46
Вс фев 04, 2024 19:26:42