写一段 STM32F103 8M时钟频率 配置 CAN 125K 程序
时间: 2024-12-20 20:24:35 浏览: 15
STM32F103微控制器通常采用HSE(High-Speed External Oscillator)作为时钟源,通过配置系统时钟树来获得所需的CAN通信频率,如125kbit/s。以下是基本步骤:
1. **启用HSE时钟**:
- 在`stm32f10x_conf.h`头文件中设置HSI(Internal High Speed RC Oscillator)频率,通常默认值是8MHz。
```c
#define HSI_VALUE 8000000U // 8 MHz (取决于实际晶振)
```
- 然后,在启动序列中打开HSI并等待稳定。
```c
RCC_OscInitTypeDef RCC_OscInitStruct;
// Enable HSE
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIClockSource = RCC_HSICALCULATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // 不使用PLL
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
// Error handling...
}
```
2. **选择系统时钟源**:
- 使用`RCC_SYSCLKConfig`函数将HSI时钟作为系统的基准时钟源。
```c
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; // 设置为HSI时钟源
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB总线时钟分频1
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1时钟分频4
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2时钟分频2
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
// Error handling...
}
```
3. **配置CAN时钟**:
- 使用`RCC_APB1PeriphClockCmd`函数开启APB1时钟,包括CAN相关的时钟。
```c
// Enable CAN1 clock
HAL_RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
```
4. **初始化CAN模块**:
- 使用CAN提供的API函数(如`CAN_DeInit()`、`CAN 初始化`等)设置CAN1的工作模式、比特率等参数。
```c
CAN_HandleTypeDef hcan1;
hcan1.Instance = CAN1;
// Configure CAN parameters for 125kbit/s mode
hcan1.Init.BaudRatePrescaler = 16; // 根据公式计算,125kbit/s需要的波特率预分频
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.Prescaler = RCC_APB1_TIM9CLK_DIV1; // 比较寄存器时钟频率 / 波特率预分频
hcan1.Init.JitterAverage = 0;
hcan1.Init.ErrorMode = CAN_ERROR_MODE Silent;
if (HAL_CAN_Init(&hcan1) != HAL_OK) {
// Error handling...
}
```
5. **开始发送和接收数据**:
- 调用`HAL_CAN_Transmit` 和 `HAL_CAN_Receive` 函数进行CAN通信。
```c
while (1) {
HAL_CAN_Transmit(&hcan1, &tx_message, 1, 100); // 发送消息
if (HAL_CAN_GetITStatus(&hcan1, CAN_IT_RXFNE)) { // 当有接收到的数据时
RX_message = HAL_CAN_ReceptionGetBuffer(&hcan1); // 获取接收到的消息
// Process received message
}
}
```
阅读全文