uint32_t CLK_GetHocoFreq(void) { uint32_t freq; uint8_t frqsel = (*(uint8_t *)0x000000C2U); frqsel &= 0xF8; /* Mask the lower 3 bits */ frqsel |= CGC->HOCODIV; /* Refer the value of HOCODIV */ freq = 1000000U; /* fIH = 1MHz except for the following cases */ switch(frqsel)这段代码是干嘛的
时间: 2024-03-28 22:37:17 浏览: 140
这段代码是用来获取 HOCO(高精度晶体振荡器)频率的函数。
首先,它从地址0x000000C2处读取一个字节,该字节的值经过一些位运算之后得到HOCO分频器的值。然后,根据HOCO分频器的值来确定实际的HOCO频率。最后,根据不同的HOCO频率,选择不同的操作。在这里,除了一些特殊情况,HOCO频率默认为1MHz。
相关问题
void delay_us(uint32_t us) { volatile uint32_t i = us * (LPUART_CLK_FREQ / 1000000) / 5; while (i--) { __NOP(); } }
这段代码实现了微秒级别的延时功能,具体实现方式是通过循环计算需要的循环次数来实现延时。其中,us 参数表示需要延时的微秒数,LPUART_CLK_FREQ 表示 LPUART 的时钟频率。根据公式 i = us * (LPUART_CLK_FREQ / 1000000) / 5,计算出需要循环的次数 i,然后通过循环操作来实现延时。其中,__NOP() 是汇编指令,表示空操作,用于占用一个时钟周期。
void usart_init(uint32_t baudrate) { /*UART 初始化设置*/ g_uart1_handle.Instance = USART_UX; /* USART_UX */ g_uart1_handle.Init.BaudRate = baudrate; /* 波特率 */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()会使能UART1 */ /* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if (huart->Instance == USART_UX) /* 如果是串口1,进行串口1 MSP初始化 */ { USART_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */ USART_RX_GPIO_CLK_ENABLE();/* 使能串口RX脚时钟 */ USART_UX_CLK_ENABLE(); /* 使能串口时钟 */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* 串口发送引脚号 */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* 串口RX脚 模式设置 */ gpio_init_struct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* 组2,最低优先级:抢占优先级3,子优先级3 */ #endif }
这段代码是用来初始化一个串口(UART)的。其中,函数usart_init()用来配置串口的一些参数,比如波特率、数据位数、停止位数等,并通过HAL_UART_Init()函数来使能串口。另外,HAL_UART_Receive_IT()函数用来开启接收中断。函数HAL_UART_MspInit()则是初始化串口的GPIO引脚和中断优先级等。在此代码中,串口号为USART_UX,具体的GPIO引脚号和中断优先级等都需要根据具体的硬件平台进行修改。
阅读全文