前些时间收到的开发板,今天来和大家分享一下,首先从硬件的角度来说。
硬件方面,LED和串口的连接方式可以通过上面的图形了解清楚。
LED1:PE1
LED2:PD0
USART2-TXD:PD5
USART2-RXD:PD6
两个引脚还应该注意复用关系,我们可以通过下面的表格得知:
有了上面的硬件基础了之后,我们就可以进行编程了,我们首先看LED的编程
- void LED_Init(void)
- {
- static GPIO_InitTypeDef GPIO_InitStruct;
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- /* -2- Configure IO in output push-pull mode to drive external LEDs */
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin =GPIO_PIN_0 ;
- //--LED2
- HAL_GPIO_Init(GPIOD , &GPIO_InitStruct);
- //--LED 1
- GPIO_InitStruct.Pin =GPIO_PIN_1 ;
- HAL_GPIO_Init(GPIOE , &GPIO_InitStruct);
-
- }
- void LED_Test(void)
- {
- HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_0);
- HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_1);
- HAL_Delay(500);
- }
复制代码LED的代码相对较简单,然后就是串口:
- #include "DRV_UART.h"
- UART_HandleTypeDef huart;
- void UART_IO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- __HAL_RCC_GPIOD_CLK_ENABLE();
-
- //--TXD
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- GPIO_InitStruct.Alternate=GPIO_AF7_USART2;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- //--RXD
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_6;
- GPIO_InitStruct.Alternate=GPIO_AF7_USART2;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
-
- }
- void UART_Init(void)
- {
- UART_IO_Init();
- __HAL_RCC_USART2_CLK_ENABLE() ;
- huart.Instance = USART2;
- huart.Init.BaudRate = 115200;
- huart.Init.WordLength = UART_WORDLENGTH_8B;
- huart.Init.StopBits = UART_STOPBITS_1;
- huart.Init.Parity = UART_PARITY_NONE;
- huart.Init.Mode = UART_MODE_TX_RX;
- huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart.Init.OverSampling = UART_OVERSAMPLING_16;
- huart.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- huart.Init.ClockPrescaler = UART_PRESCALER_DIV1;
- huart.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- if (HAL_UART_Init(&huart) != HAL_OK)
- {
- }
- }
- int fputc(int ch, FILE *f)
- {
- HAL_UART_Transmit(&huart, (uint8_t *)&ch, 1, 0xffff);
- return ch;
- }
复制代码
完成了串口之后我们就来定时器的操作。
- #include "DRV_TIM.h"
- #include "DRV_UART.h"
- TIM_HandleTypeDef htim1;
- void TIM_Init(void)
- {
-
- __HAL_RCC_TIM1_CLK_ENABLE();
- htim1.Instance = TIM1;
- htim1.Init.Prescaler = 0;
- htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim1.Init.Period = 119;
- htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim1.Init.RepetitionCounter = 999;
- htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
- if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
- {
-
- }
- HAL_TIM_Base_Start_IT(&htim1);
- HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
- }
- int count=0;
- void TIM1_UP_TIM16_IRQHandler(void)
- {
- if(__HAL_TIM_GET_FLAG(&htim1,TIM_FLAG_UPDATE)!=RESET)
- {
- count++;
- if(count==1000)
- {
- count=0;
- LED_Test();
- printf("Hello STM32L4R9ZI !\r\n");
- }
- __HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_UPDATE);
- }
- }
复制代码完成上面的代码之后,我们经过主函数的调用
- #include "stm32l4xx_hal.h"
- #include "DRV_LED.h"
- #include "DRV_UART.h"
- int main(void)
- {
- SystemClock_Config();
- HAL_Init();
- LED_Init();
- UART_Init();
- TIM_Init();
- while (1)
- {
-
- }
- }
复制代码整个串口,LED、定时器的测试工作就完成了,我们来看一下具体的效果。
串口按照1s 的频率来打印串口字符。
两个指示灯也按照1s的频率来闪烁
|
细致、全面,对小白很友好!~