|
板子回来了就开始了程序的编写,最基础的就是点灯,然后就是串口和定时器的测试,今天正好工作做完了,就来做一下最基础的接口测试,首先我们需要知道硬件的连接情况,
#include "DRV_LED.h"
void LED_Init(void)
{
static GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_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_6 ;
HAL_GPIO_Init(GPIOC , &GPIO_InitStruct);
}
void LED_Test(void)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_6);
HAL_Delay(500);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
RCC_OscInitStruct.PLL.PLLN = 85;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
}
}
上面的是LED的和时钟的函数。
#include "DRV_TIM.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 = 170;
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;
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);
}
__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_UPDATE);
}
}
上面的是定时器的。
#include "DRV_UART.h"
UART_HandleTypeDef huart;
void UART_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_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_4;
GPIO_InitStruct.Alternate=GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOB, &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_3;
GPIO_InitStruct.Alternate=GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOB, &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;
}
好了整体效果可以参考下面的图