基于stm32cube软件使用stm32f103zet6开发板设计一个实验,要求如下:1.通过定时器2定时2秒;2.定时器定时时间到时,通过连接在ADC1的通道16上的STM32F103内部温度传感器获取芯片内部的温度;3.利用DMA传输方式通过串口将采集到的温度数据显示出来。
时间: 2024-02-09 15:13:25 浏览: 90
好的,这是一个基于STM32Cube软件使用STM32F103ZET6开发板的实验设计,要求实现以下功能:
1. 通过定时器2定时2秒;
2. 定时器定时时间到时,通过连接在ADC1的通道16上的STM32F103内部温度传感器获取芯片内部的温度;
3. 利用DMA传输方式通过串口将采集到的温度数据显示出来。
以下是实现步骤:
1. 打开STM32CubeMX软件,选择STM32F103ZET6开发板,配置如下:
- 开启TIM2定时器,设置预分频器为7199,设置自动重载寄存器值为999,以实现2秒的定时器中断;
- 开启ADC1模块,设置采样通道为16,即内部温度传感器;
- 打开USART1串口,设置波特率为115200,配置DMA传输方式。
2. 在代码中定义变量和函数:
```c
#include "main.h"
/* 定义变量 */
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_usart1_tx;
/* 定义函数 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
```
3. 在main函数中初始化硬件:
```c
int main(void)
{
/* MCU Configuration */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* 开启DMA传输 */
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)"Temperature: ", strlen("Temperature: "));
/* 开启ADC转换 */
HAL_ADC_Start(&hadc1);
/* 启动定时器2 */
HAL_TIM_Base_Start_IT(&htim2);
/* 在循环中等待中断 */
while (1)
{
}
}
```
4. 实现定时器中断处理函数,在中断处理函数中读取内部温度传感器的值,并通过DMA方式将其发送到串口:
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
/* 定时器中断 */
uint32_t temperature = HAL_ADC_GetValue(&hadc1);
char temp_str[10];
sprintf(temp_str, "%lu\n", temperature);
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)temp_str, strlen(temp_str));
}
}
```
5. 最后是各个模块的初始化函数,具体代码请参考以下代码:
```c
/* System Clock Configuration */
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
/**Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* ADC1 init function */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/* 基本初始化 */
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/* 温度传感器初始化 */
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
/* DMA init function */
void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
/* 基本初始化 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* 开启DMA传输 */
HAL_UART_RegisterCallback(&huart1, HAL_UART_TX_COMPLETE_CB_ID, HAL_UART_TxCpltCallback);
HAL_UART_RegisterCallback(&huart1, HAL_UART_ERROR_CB_ID, HAL_UART_ErrorCallback);
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)"Temperature: ", strlen("Temperature: "));
}
/* GPIO init function */
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
}
```
阅读全文