hc32l13x使用RC振荡器示例
时间: 2023-07-11 13:24:01 浏览: 103
好的,以下是使用HC32L13x内部RC振荡器作为系统时钟源的示例代码:
```c
#include "hc32l13x.h"
int main(void)
{
// 使能内部RC振荡器
M0P_SYSCTRL->PERI_CLKEN_f.RC = 1;
// 设置RC振荡器的频率校准值,可以先使用默认值,或者根据实际情况进行校准
M0P_SYSCTRL->RCL_CR_f.TRIM = 0x3F;
// 启动RC振荡器
M0P_SYSCTRL->RCL_CR_f.SATRUP = 1;
// 等待RC振荡器稳定
while (!M0P_SYSCTRL->RCL_CR_f.STABLE);
// 将RC振荡器作为系统时钟源
M0P_SYSCTRL->SYSCTRL0_f.CLKSEL = 0;
M0P_SYSCTRL->SYSCTRL0_f.CLKSW = 0;
// 系统初始化完成,进入主程序
while (1);
}
```
这段代码首先使能了内部RC振荡器,然后设置了RC振荡器的频率校准值,启动了RC振荡器,并在等待RC振荡器稳定后将其作为系统时钟源。最后,程序进入主循环,等待其他代码的执行。
需要注意的是,在使用RC振荡器作为系统时钟源时,由于RC振荡器的频率不如晶体振荡器稳定,因此系统时钟的精度可能会受到一定的影响。如果需要更高的时钟精度,可以考虑使用外部晶体振荡器。
相关问题
hc32l13x使用RC振荡器开启串口功能示例
好的,以下是使用HC32L13x内部RC振荡器开启串口功能的示例代码:
```c
#include "hc32l13x.h"
void InitUart(void)
{
// 使能UART0模块时钟
M0P_CLOCK->PERI_CLKEN_f.UART0 = 1;
// 设置UART0引脚复用功能
M0P_GPIO->PAADS_f.PA01 = 0; // 设置PA01为数字模式
M0P_GPIO->PAFUNC_f.PA01 = 1; // 设置PA01为UART0_RXD
M0P_GPIO->PAADS_f.PA02 = 0; // 设置PA02为数字模式
M0P_GPIO->PAFUNC_f.PA02 = 1; // 设置PA02为UART0_TXD
// 配置UART0工作参数
M0P_UART->SCON_f.SM = 1; // 串口工作在模式1(8位数据位,可变波特率)
M0P_UART->SCON_f.REN = 1; // 启用接收功能
M0P_UART->SCON_f.TI = 1; // TI置1,准备发送数据
M0P_UART->SCON_f.RI = 0; // RI清0,准备接收数据
M0P_UART->BGR_f.DIV = (uint16_t)(SystemCoreClock / 115200); // 设置波特率
// 使能UART0发送和接收中断
M0P_UART->SCON_f.TIE = 1;
M0P_UART->SCON_f.RIE = 1;
// 使能全局中断
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_EnableIRQ(UART0_IRQn);
__enable_irq();
}
void UART0_IRQHandler(void)
{
// UART0接收中断处理
if (M0P_UART->SCON_f.RI)
{
uint8_t data = M0P_UART->SBUF_f.DATA;
// TODO: 处理接收到的数据
M0P_UART->SCON_f.RI = 0; // RI清0,准备接收下一帧数据
}
// UART0发送中断处理
if (M0P_UART->SCON_f.TI)
{
// TODO: 发送数据
M0P_UART->SCON_f.TI = 0; // TI清0,准备发送下一帧数据
}
}
int main(void)
{
// 初始化UART0模块
InitUart();
// 进入主程序
while (1);
}
```
这段代码首先使能了UART0模块的时钟,然后设置了UART0引脚复用功能和工作参数。接下来,使能了UART0发送和接收中断,并在中断处理函数中处理接收到的数据和发送数据。最后,程序进入主循环,等待其他代码的执行。
需要注意的是,由于使用了RC振荡器作为系统时钟源,因此需要根据实际情况对波特率进行校准,以保证UART通信的稳定性。
hc32l13x串口使用RC振荡器开启串口功能示例
以下是使用HC32L13X芯片的RC振荡器开启串口功能的示例代码:
```c
#include "hc32l13x.h"
#define USART_TX_PORT GPIO_PORT_1
#define USART_TX_PIN GPIO_PIN_0
#define USART_RX_PORT GPIO_PORT_1
#define USART_RX_PIN GPIO_PIN_1
#define USART_UNIT M0P_USART0
#define USART_UNIT_CLOCK PWC_FCG1_USART0
#define USART_FUNCTION_CLK PWC_FCG3_FUNC_USART
#define USART_CLKSRC USART_CLK_SRC_HCLK
#define USART_BAUDRATE 9600u
/**
* @brief 串口初始化函数
* @param None
* @retval None
*/
void USART_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_usart_uart_init_t stcUsartInit;
/* 使能GPIO外设时钟 */
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_GPIO, Enable);
/* USART TX端口配置 */
GPIO_StructInit(&stcGpioCfg);
stcGpioCfg.u16PinDrv = GPIO_PINDRV_HIGH;
GPIO_Init(USART_TX_PORT, USART_TX_PIN, &stcGpioCfg);
GPIO_SetFunc(USART_TX_PORT, USART_TX_PIN, GPIO_FUNC_5_USART);
/* USART RX端口配置 */
GPIO_StructInit(&stcGpioCfg);
stcGpioCfg.u16PinDrv = GPIO_PINDRV_HIGH;
GPIO_Init(USART_RX_PORT, USART_RX_PIN, &stcGpioCfg);
GPIO_SetFunc(USART_RX_PORT, USART_RX_PIN, GPIO_FUNC_5_USART);
/* 使能USART外设时钟 */
PWC_Fcg1PeriphClockCmd(USART_UNIT_CLOCK, Enable);
/* USART初始化配置 */
USART_UART_StructInit(&stcUsartInit);
stcUsartInit.u32Baudrate = USART_BAUDRATE;
stcUsartInit.u32ClkMode = USART_CLKSRC;
USART_UART_Init(USART_UNIT, &stcUsartInit);
/* 使能USART模块 */
USART_FunctionCmd(USART_UNIT, UsartTx | UsartRx, Enable);
}
int main(void)
{
/* 初始化串口 */
USART_Init();
/* 其他初始化代码 */
while (1)
{
/* 业务处理代码 */
}
}
```
以上示例代码中,我们通过设置串口的GPIO端口和外设时钟,以及配置USART初始化参数,最终使能USART模块,从而开启串口功能。需要注意的是,具体的GPIO端口和外设时钟配置,以及USART初始化参数的设置,需要根据实际情况进行调整。
阅读全文