CGC->CMC = _40_CGC_HISYS_OSC | _10_CGC_SUB_OSC | _02_CGC_NORMAL_OSCILLATION | _01_CGC_SYSOSC_OVER10M;
时间: 2024-08-13 08:09:40 浏览: 120
这是一个代码片段,看起来是在设置某个系统的时钟生成控制(Clock Generation Control, CGC)模式。在这个表达式中:
- `_40_CGC_HISYS_OSC`:表示高系统时钟(High System Clock, HISYS OSC),可能指的是大于10MHz的系统时钟源。
- `_10_CGC_SUB_OSC`:这可能是指子时钟(Sub-Oscillator),即辅助或备用频率源,频率为10MHz。
- `_02_CGC_NORMAL_OSCILLATION`:正常振荡器(Normal Oscillation),意味着使用默认的标准振荡器,可能是某个固定频率。
- `_01_CGC_SYSOSC_OVER10M`:当系统时钟超过10MHz时启用此标志。
整个表达式的含义是将CGC配置为优先使用高系统时钟源(如果超过10MHz),其次是10MHz的子时钟,如果前两者都不满足,则使用标准的正常振荡器。如果系统时钟最终确实超过10MHz,`_01_CGC_SYSOSC_OVER10M`会被置位。
相关问题
MD_STATUS SPI_MasterSend(uint8_t *const tx_buf, uint16_t tx_num) { MD_STATUS status = MD_OK; *tx_buf = (*tx_buf << 1) | 0x80; if (tx_num < 1U) { status = MD_ERROR; } else { SPI->SPIM |= _0040_SPI_RECEPTION_TRANSMISSION | _0008_SPI_BUFFER_EMPTY; /* transmission mode */ #ifdef SPI_WITH_DMA /* write transfer data with DMA */ DMAVEC->VEC[DMA_VECTOR_SPI] = CTRL_DATA_SPI; DMAVEC->CTRL[CTRL_DATA_SPI].DMACR = (0 << CTRL_DMACR_SZ_Pos) | (0 << CTRL_DMACR_CHNE_Pos) | (0 << CTRL_DMACR_DAMOD_Pos) | (1 << CTRL_DMACR_SAMOD_Pos) | (0 << CTRL_DMACR_MODE_Pos); DMAVEC->CTRL[CTRL_DATA_SPI].DMBLS = 1; DMAVEC->CTRL[CTRL_DATA_SPI].DMACT = tx_num - 1; DMAVEC->CTRL[CTRL_DATA_SPI].DMRLD = tx_num - 1; DMAVEC->CTRL[CTRL_DATA_SPI].DMSAR = (uint32_t)(tx_buf + 1); DMAVEC->CTRL[CTRL_DATA_SPI].DMDAR = (uint32_t)&SPI->SDRO; /* init DMA registers */ CGC->PER1 |= CGC_PER1_DMAEN_Msk; DMA->DMABAR = DMAVEC_BASE; DMA->DMAEN1 |= (1 << DMA_VECTOR_SPI % 8); #endif #ifdef SPI_WITH_DMA g_spi_tx_count = 1; /* send data count */ gp_spi_tx_address = tx_buf; /* send buffer pointer */ #else printf("3333333333333\n"); g_spi_tx_count = tx_num; /* send data count */ gp_spi_tx_address = tx_buf; /* send buffer pointer */ printf("gp_spi_tx_address==%p\n",gp_spi_tx_address); printf("4444444444444444\n"); #endif SPI_Start(); printf("........."); SPI->SDRO = *gp_spi_tx_address; /* started by writing data to SDRO */ printf("77777777777777777\n"); gp_spi_tx_address++; g_spi_tx_count--; } return (status); }解释一下这个代码
这段代码是一个SPI主机发送数据的函数。函数接收两个参数,一个是指向要发送数据的缓冲区的指针`tx_buf`,另一个是要发送的数据的数量`tx_num`。
首先,代码将缓冲区中的第一个数据做了一些处理,将其左移1位并将最高位置为1,然后赋值给原来的位置。这个操作可能是为了设置SPI传输的某些特殊标志位。
接下来,代码检查`tx_num`是否小于1,如果是,则将`status`设置为`MD_ERROR`,表示发送错误。否则,代码将设置SPI控制寄存器的相关位,使其进入传输模式。
接着,代码判断是否使用DMA进行数据传输。如果使用DMA,则进行一系列DMA相关的设置,并启动DMA传输。如果不使用DMA,则设置`g_spi_tx_count`为要发送的数据量,设置`gp_spi_tx_address`为要发送数据的指针。
然后,代码调用`SPI_Start()`函数开始SPI传输。
最后,代码将第一个要发送的数据写入SPI数据寄存器,并递增`gp_spi_tx_address`指针和递减`g_spi_tx_count`计数器,以便发送下一个数据。
最后,函数返回状态值`status`。
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)这段代码是干嘛的
这段代码是用来获取 HOCO(高精度晶体振荡器)频率的函数。
首先,它从地址0x000000C2处读取一个字节,该字节的值经过一些位运算之后得到HOCO分频器的值。然后,根据HOCO分频器的值来确定实际的HOCO频率。最后,根据不同的HOCO频率,选择不同的操作。在这里,除了一些特殊情况,HOCO频率默认为1MHz。
阅读全文