完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
时钟初始化 clk_init()
CMU:时钟管理单元 LFXO: Low frequency crystal oscillator CMU_OscillatorEnable(cmuOsc_LFXO, true, true); 功能:使能振荡器 Oscillator:有源晶振;Crystal:无源晶振 CMU_ClockSelectSet(cmuClock_LFA,cmuSelect_LFXO); 功能:给时钟分支选择参考时钟或振荡器 LFA: LF A 分支;低频A时钟 CMU_ClockSelectSet(cmuClock_LFB,cmuSelect_LFXO); 功能:给时钟分支选择参考时钟或振荡器 LFB: LF B 分支;低频B时钟 void clk_init(void) { CMU_ClockEnable(cmuClock_HFPER, true); /* High frequency peripheral clock */ CMU_ClockEnable(cmuClock_CORELE, true); /* Low energy clocking module clock */ CMU_ClockEnable(cmuClock_GPIO, true); /* General purpose input/output clock */ CMU_OscillatorEnable(cmuOsc_LFXO, true, true); CMU_ClockSelectSet(cmuClock_LFA,cmuSelect_LFXO); CMU_ClockSelectSet(cmuClock_LFB,cmuSelect_LFXO); } 内存系统控制器初始化 MSC_Init() MSC:Memory System Controller (em_msc.c) #define MSC ((MSC_TypeDef ) MSC_BASE) /*MSC base pointer / Register Map实现方式:将基地址转换成结构体地址,结构体定义了对应的寄存器映射(Register Map),offset和芯片手册相对应。MSC_TIMEBASE寄存器就在其中。 6位:PERIOD周期 — 0 – 1US 1 – 5US(5US应该仅仅被用在1MHz的AUXHFRCO品牌) 5:0位:被MSC用来对flash写和擦除进行time(打节拍)的timebase void MSC_Init(void) { #if defined( _MSC_TIMEBASE_MASK ) uint32_t freq, cycles; #endif /* Unlock the MSC 解锁MSC */ MSC->LOCK = MSC_UNLOCK_CODE; /* Disable writing to the flash 禁止flash写操作 */ MSC->WRITECTRL &= ~MSC_WRITECTRL_WREN; #if 0 #if defined( _MSC_TIMEBASE_MASK ) /* Configure MSC->TIMEBASE according to selected frequency */ #ifdef EMLIB_THIN freq = 14000000; #else freq = CMU_ClockFreqGet(cmuClock_AUX); #endif if (freq > 7000000) { /* Calculate number of clock cycles for 1us as base period */ freq = (freq * 11) / 10; cycles = (freq / 1000000) + 1; /* Configure clock cycles for flash timing */ MSC->TIMEBASE = (MSC->TIMEBASE & ~(_MSC_TIMEBASE_BASE_MASK | _MSC_TIMEBASE_PERIOD_MASK)) | MSC_TIMEBASE_PERIOD_1US | (cycles << _MSC_TIMEBASE_BASE_SHIFT); } else { #ifndef EMLIB_THIN /* Calculate number of clock cycles for 5us as base period */ freq = (freq * 5 * 11) / 10; cycles = (freq / 1000000) + 1; /* Configure clock cycles for flash timing */ 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 } 串口初始化 uart_init() void uart_init(void) { LEUART_Init_TypeDef leuart0Init = { .enable = leuartEnable, /* Activate data reception on LEUn_TX pin. */ .refFreq = 0, /* Inherit the clock frequenzy from the LEUART clock source */ .baudrate = 9600, /* Baudrate = 9600 bps */ .databits = leuartDatabits8, /* Each LEUART frame containes 8 databits */ .parity = leuartNoParity, /* No parity bits in use */ .stopbits = leuartStopbits1, /* Setting the number of stop bits in a frame to 2 bitperiods */ }; //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, true); LEUART_Reset(LEUART0); //复位 LEUART_Init(LEUART0, &leuart0Init); //初始化 /* Route LEUART1 TX pin to DMA location 1 */ LEUART0->ROUTE = LEUART_ROUTE_TXPEN | LEUART_ROUTE_RXPEN | LEUART_ROUTE_LOCATION_LOC1; /* Enable GPIO for LEUART1. TX is on PB13 */ GPIO_PinModeSet(gpioPortB, /* GPIO port */ 13, /* GPIO port number */ gpioModePushPull, /* Pin mode is set to push pull */ 1); /* High idle state */ /* Enable GPIO for LEUART1. RX is on PB14 */ GPIO_PinModeSet(gpioPortB, /* Port */ 14, /* Port number */ gpioModeInputPull, /* Pin mode is set to input only, with pull direction given bellow */ 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 (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) { data = LEUART0->RXDATA; //接收到数据data处理 } } 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, true); 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转换 } |
|
|
|
只有小组成员才能发言,加入小组>>
2514 浏览 0 评论
1092浏览 2评论
703浏览 1评论
456浏览 0评论
200浏览 0评论
340浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:19 , Processed in 1.345103 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号