单片机小组
直播中

池鹄展

7年用户 919经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

EFM32是什么?如何去使用EFM32单片机?

请问一下EFM32是什么?如何去使用EFM32单片机

回帖(1)

康选谦

2021-7-1 11:58:25
  时钟初始化 clk_init()
  CMU:
  时钟管理单元LFXO:低频晶振
  CMU_scillatorEnable(cmuOsc_FXO, true);
  功能:使能
  晶源Oscillator:使能晶源Oscillator:
  CMU_ClockSelectSet(cmuClock_LFA,cmSelect_LFXO);:
  给企业分支选择参考或时钟功能
  。LFA: LF A分支;A
  CMU_ClockSelectSet(cmuClockSelectSet(cmuC_LFB,cmSelect_LFXO);:
  给企业分支选择参考或商标功能
  LFB:LF B分支;B
  void clk_init(void){ CMU_ClockEnable(cmuClock_HFPER, true); /* 高频外设时钟 */ CMU_ClockEnable(cmuClock_CORELE, true); /* 低功耗时钟模块时钟 */ CMU_ClockEnable(cmuClock_GPIO, true); /* 通用输入/输出时钟 */ CMU_OscillatorEnable(cmuOsc_LFXO, true, true); CMU_ClockSelectSet(cmuClock_LFA,cmuSelect_LFXO); CMU_ClockSelectSet(cmuClock_LFB,cmuSelect_LFXO); }内存系统控制器初始化MSC_Init()
  MSC:内存系统控制器 (em_msc.c)
  #define MSC ((MSC_TypeDef ) MSC_BASE) /*MSC基指针/
  寄存器映射实现方式:将基地址转换成结构体地址,结构体定义了对应的映射映射(Register Map),偏移和芯片手册相对应。MSC_TIMEBASE喜欢就在其中。
  6位:PERIOD生命周期——0-1US 1-5US(5US应该是被用在1MHz的AUXHFRCO品牌)
  5:0位:被MSC对flash写和对话框进行时间(打节拍)的时基
  void MSC_Init(void){#if defined(_MSC_TIMEBASE_MASK) uint32_t freq,cycles;#endif 解锁 MSC 设备/*MSC */ MSC-LOCK = MSC_UNLOCK_CODE; /* 禁止写入闪存禁止闪存写操作 */ MSC-》WRITECTRL &= ~MSC_WRITECTRL_WREN;#if 0#if defined( _MSC_TIMEBASE_MASK ) /* 根据选择的频率配置 MSC-》TIMEBASE */#ifdef EMLIB_THIN freq = 14000000 ;#else freq = CMU_ClockFreqGet(cmuClock_AUX);#endif if (freq 》 7000000) { /* 计算 1us 的时钟周期数作为基周期 */ freq = (freq * 11) / 10; 周期 = (频率 / 1000000) + 1; /* 配置闪存时序的时钟周期 */ MSC-》TIMEBASE = (MSC-》TIMEBASE & ~(_MSC_TIMEBASE_BASE_MASK | _MSC_TIMEBASE_PERIOD_MASK)) | MSC_TIMEBASE_PERIOD_1US | (循环《《 _MSC_TIMEBASE_BASE_SHIFT); } else {#ifndef EMLIB_THIN /* 以5us为基周期计算时钟周期数*/ freq = (freq * 5 * 11) / 10; 周期 = (频率 / 1000000) + 1; /* 配置闪存时序的时钟周期 */ MSC-》TIMEBASE = (MSC-》TIMEBASE & ~(_MSC_TIMEBASE_BASE_MASK | _MSC_TIMEBASE_PERIOD_MASK)) | MSC_TIMEBASE_PERIOD_5US | (cycles 《《 _MSC_TIMEBASE_BASE_SHIFT);#endif /* EMLIB_THIN */ }#endif#endif} ~(_MSC_TIMEBASE_BASE_MASK | _MSC_TIMEBASE_PERIOD_MASK)) | MSC_TIMEBASE_PERIOD_5US | (cycles 《《 _MSC_TIMEBASE_BASE_SHIFT);#endif /* EMLIB_THIN */ }#endif#endif} ~(_MSC_TIMEBASE_BASE_MASK | _MSC_TIMEBASE_PERIOD_MASK)) | MSC_TIMEBASE_PERIOD_5US | (cycles 《《 _MSC_TIMEBASE_BASE_SHIFT);#endif /* EMLIB_THIN */ }#endif#endif}串口初始化 uart_init()
  void uart_init(void){ LEUART_Init_TypeDef leuart0Init = { .enable = leuartEnable, /* 激活 LEUn_TX 引脚上的数据接收。*/ .refFreq = 0, /* 从 LEUART 时钟源继承时钟频率 */ .baudrate = 9600, /* Baudrate = 9600 bps */ .databits = leuartDatabits8, /* 每个 LEUART 帧包含 8 个数据位 */ .parity = leuartNoParity, /* 没有使用奇偶校验位 */ .stopbits = leuartStopbits1, /* 将帧中的停止位数量设置为 2 个比特周期 */ }; //CMU_ClockEnable(cmuClock_HFPER, true); //CMU_ClockEnable(cmuClock_CORELE, true); //CMU_ClockSelectSet(cmuClock_LFA, cmuSelect_LFRCO); //CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_LFRCO); CMU_ClockEnable(cmuClock_LEUART0,真);LEUART_Reset(LEUART0); //复位LEUART_Init(LEUART0, &leuart0Init); //初始化 /* 将 LEUART1 TX 引脚路由到 DMA 位置 1 */ LEUART0-》ROUTE = LEUART_ROUTE_TXPEN | LEUART_ROUTE_RXPEN | LEUART_ROUTE_LOCATION_LOC1; /* 启用 LEUART1 的 GPIO。TX 在 PB13 */ GPIO_PinModeSet(gpioPortB, /* GPIO 端口 */ 13, /* GPIO 端口号 */ gpioModePushPull, /* 引脚模式设置为推挽 */ 1); /* 高空闲状态 */ /* 启用 LEUART1 的 GPIO。RX 在 PB14 */ GPIO_PinModeSet(gpioPortB, /* Port */ 14, /* Port number */ gpioModeInputPull, /* 引脚模式设置为仅输入,拉动方向如下*/ 1); /* Pull direction is set to pull-up */ /* 有效接收数据中断使能 */ LEUART_IntEnable(LEUART0, LEUART_IEN_RXDATAV); LEUART0-》IFC = 0xffff;//清空所有的中断标志NVIC_EnableIRQ(LEUART0_IRQn); //初始化外部中断FifoInit(&uart_rx_fifo); //初始化长度}void uart_send_buf(uint8_t *buf, uint8_t length){ while (--) { LEUART_Tx(LEUART0, *buf++); }}void uart_send_string(char *str){ while (*str) { LEUART_Tx(LEUART0, *str++); }}//接收中断函数void LEUART0_IRQHandler(void) { static uint8_t data; __IO uint32_t leuartif; leuartif = LEUART_IntGet(LEUART0); LEUART_IntClear(LEUART0, leuartif); if (leuartif & LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} LEUART_IEN_RXDATAV); LEUART0-》IFC = 0xffff;//清空所有的中断标志NVIC_EnableIRQ(LEUART0_IRQn); //初始化外部中断FifoInit(&uart_rx_fifo); //初始化长度}void uart_send_buf(uint8_t *buf, uint8_t length){ while (--) { LEUART_Tx(LEUART0, *buf++); }}void uart_send_string(char *str){ while (*str) { LEUART_Tx(LEUART0, *str++); }}//接收中断函数void LEUART0_IRQHandler(void) { static uint8_t data; __IO uint32_t leuartif; leuartif = LEUART_IntGet(LEUART0); LEUART_IntClear(LEUART0, leuartif); if (leuartif & LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} LEUART_IEN_RXDATAV); LEUART0-》IFC = 0xffff;//清空所有的中断标志NVIC_EnableIRQ(LEUART0_IRQn); //初始化外部中断FifoInit(&uart_rx_fifo); //初始化长度}void uart_send_buf(uint8_t *buf, uint8_t length){ while (--) { LEUART_Tx(LEUART0, *buf++); }}void uart_send_string(char *str){ while (*str) { LEUART_Tx(LEUART0, *str++); }}//接收中断函数void LEUART0_IRQHandler(void) { static uint8_t data; __IO uint32_t leuartif; leuartif = LEUART_IntGet(LEUART0); LEUART_IntClear(LEUART0, leuartif); if (leuartif & LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} uint8_t length){ while (length--) { LEUART_Tx(LEUART0, *buf++); }}void uart_send_string(char *str){ while (*str) { LEUART_Tx(LEUART0, *str++); }}//接收中断函数void LEUART0_IRQHandler(void) { static uint8_t data; __IO uint32_t leuartif; leuartif = LEUART_IntGet(LEUART0); LEUART_IntClear(LEUART0, leuartif); if (leuartif & LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} uint8_t length){ while (length--) { LEUART_Tx(LEUART0, *buf++); }}void uart_send_string(char *str){ while (*str) { LEUART_Tx(LEUART0, *str++); }}//接收中断函数void LEUART0_IRQHandler(void) { static uint8_t data; __IO uint32_t leuartif; leuartif = LEUART_IntGet(LEUART0); LEUART_IntClear(LEUART0, leuartif); if (leuartif & LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }} LEUART_IF_RXDATAV) { 数据 = LEUART0-》RXDATA; //接收到数据数据处理 }}ADC 初始化 adc_init()
  void adc_init(void){ ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT; CMU_ClockEnable(cmuClock_ADC0,真);init.timebase = ADC_TimebaseCalc(0); init.prescale = ADC_PrescaleCalc(7000000, 0); ADC_Init(ADC0, &init); singleInit.reference = adcRef2V5; //内部参考电压2.5V singleInit.input = adcSingleInpCh4; singleInit.resolution = adcRes12Bit; //12bit采样 singleInit.acqTime = adcAcqTime256; ADC_InitSingle(ADC0, &singleInit); //单次ADC转换 }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分