伴隨著濃濃的中國芯熱情下,國產晶片越來越好了,國產單片機也逐漸成為工程師的優選。
那麼用國產單片機開發究竟是怎樣的體驗?
1、利用東軟載波開發板進行ADC及PWM調光測試
這位工程師是來自21ic論壇的用戶hbzjt2011,他選用了ES32F0654LT進行這次開發。 ES32F0654LT集成的支持 1 路模數轉換器(ADC0)。ADC(Analog to Digital Convertor)是 12 位解析度的逐次逼近型模數轉換器。它具有多達 19 個復用通道,可測量從管腳輸入的 16 個外部信號、3 個內部信號。這些通道的模數轉換可在單次、連續、掃描或不連續採樣模式下進行。ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。 ESF0654 PDS開發板ADC接在PB0接口,PB0為ADC0的14通道。
IO引腳配置如下:
static void adc_pin_init(void){ gpio_init_t x;
x.mode = GPIO_MODE_INPUT; x.odos = GPIO_PUSH_PULL; x.pupd = GPIO_PUSH_UP; x.odrv = GPIO_OUT_DRIVE_NORMAL; x.flt = GPIO_FILTER_DISABLE; x.type = GPIO_TYPE_TTL; x.func = GPIO_FUNC_0; ald_gpio_init(GPIOB, GPIO_PIN_0, &x);
return;}
ADC0的配置如下:
void adc_init(void){ memset(&h_adc, 0x0, sizeof(adc_handle_t)); memset(®_config, 0x0, sizeof(adc_nch_conf_t));
adc_pin_init();
h_adc.perh = ADC0; h_adc.init.data_align = ADC_DATAALIGN_RIGHT; h_adc.init.scan_mode = DISABLE; h_adc.init.cont_mode = DISABLE; h_adc.init.nch_len = ADC_NCH_LEN_1; h_adc.init.disc_mode = ADC_ALL_DISABLE; h_adc.init.disc_nbr = ADC_DISC_NBR_1; h_adc.init.conv_res = ADC_CONV_RES_10; h_adc.init.clk_div = ADC_CKDIV_128; h_adc.init.neg_ref = ADC_NEG_REF_VSS; h_adc.init.pos_ref = ADC_POS_REF_VDD;
ald_adc_init(&h_adc);
reg_config.channel = ADC_CHANNEL_14; reg_config.rank = ADC_NCH_RANK_1; reg_config.samp_time = ADC_SAMPLETIME_4; ald_adc_normal_channel_config(&h_adc, ®_config);
return;}
static void tim3_pin_init(void){ gpio_init_t GPIO_InitStructure;
GPIO_InitStructure.mode = GPIO_MODE_OUTPUT; GPIO_InitStructure.odos = GPIO_PUSH_PULL; GPIO_InitStructure.pupd = GPIO_PUSH_UP; GPIO_InitStructure.odrv = GPIO_OUT_DRIVE_NORMAL; GPIO_InitStructure.flt = GPIO_FILTER_DISABLE; GPIO_InitStructure.type = GPIO_TYPE_TTL; GPIO_InitStructure.func = GPIO_FUNC_3;
ald_gpio_init(GPIOC, GPIO_PIN_6, &GPIO_InitStructure);
}
TIM3初始化程序如下:
void tim3_init(timer_handle_t *tim_h, timer_oc_init_t *tim_ocinit, timer_clock_config_t *tim_clock){ tim3_pin_init();
tim_h->perh = GP16C2T1; tim_h->init.prescaler = 0; tim_h->init.mode = TIMER_CNT_MODE_UP; tim_h->init.period = (uint32_t)(255 - 1); tim_h->init.clk_div = TIMER_CLOCK_DIV1; tim_h->init.re_cnt = 0; ald_timer_pwm_init(tim_h);
tim_clock->source = TIMER_SRC_INTER; ald_timer_config_clock_source(tim_h, tim_clock);
tim_ocinit->oc_mode = TIMER_OC_MODE_PWM1; tim_ocinit->oc_polarity = TIMER_OC_POLARITY_HIGH; tim_ocinit->oc_fast_en = DISABLE; tim_ocinit->ocn_polarity = TIMER_OCN_POLARITY_HIGH; tim_ocinit->ocn_idle = TIMER_OCN_IDLE_RESET; tim_ocinit->oc_idle = TIMER_OC_IDLE_RESET;
tim_ocinit->pulse = (uint32_t)(255 * 20 / 100); ald_timer_oc_config_channel(tim_h, tim_ocinit, TIMER_CHANNEL_1);
tim_ocinit->pulse = (uint32_t)(255 * 50 / 100); ald_timer_oc_config_channel(tim_h, tim_ocinit, TIMER_CHANNEL_2);
ald_timer_oc_start(tim_h, TIMER_CHANNEL_1);
}
value = adc_average(); sprintf((char *)tx_buf, "ADC_Value: %d \n", value); ald_uart_send(&h_uart, tx_buf, sizeof("ADC_Value: %d \n"), 1000);
duty = value/32.72; if(duty <= 1) duty = 1; ald_timer_pwm_set_duty(&tim3.tim_h, TIMER_CHANNEL_1, (uint16_t)duty);
uint8_t dht11_read_data(uint8_t *temp, uint8_t *humi){ uint8_t buf[5] = {0}; uint8_t i;
dht11_reset();
if (dht11_check() == 0) { for (i = 0; i < 5; i++) buf[i] = dht11_read_byte();
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) { *humi = buf[0]; *temp = buf[2]; } } else return 1;
return 0;}
uint8_t dht11_init(void){ dht11_pin_init(); ald_delay_ms(100); dht11_reset();
return dht11_check();}
rtc.c
void rtc_init(void *rtc_param){ rtc_param_t *p_rtc = (rtc_param_t *)rtc_param;
p_rtc->init.asynch_pre_div = 0; p_rtc->init.synch_pre_div = 32767; p_rtc->init.hour_format = RTC_HOUR_FORMAT_24; p_rtc->init.output = RTC_OUTPUT_DISABLE; p_rtc->init.output_polarity = RTC_OUTPUT_POLARITY_HIGH; ald_rtc_init(&p_rtc->init);
p_rtc->time.hour = 18; p_rtc->time.minute = 31; p_rtc->time.second = 43; p_rtc->time.sub_sec = 123; p_rtc->date.day = 15; p_rtc->date.month = 12; p_rtc->date.year = 19; p_rtc->date.week = 7; ald_rtc_set_time(&p_rtc->time, RTC_FORMAT_DEC); ald_rtc_set_date(&p_rtc->date, RTC_FORMAT_DEC);
ald_rtc_interrupt_config(RTC_IT_SEC, ENABLE);}
【二】OLED顯示屏模塊:
這裡使用了OLED12864顯示液晶,採用模擬IIC進行驅動,便於程序的移植。
int main(){ ald_cmu_init(); ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_48M); ald_cmu_clock_config(CMU_CLOCK_PLL1, 48000000);
memset(tx_buf, 0x55, sizeof(tx_buf));
uart_usb_init();
led_pin_init();
dht11_init();
OLED_Init();
rtc_init(&rtc_h);
while (1) {
cnt++; if(cnt == 5) { ald_gpio_write_pin(LED1_PORT, LED1_PIN, 0); ald_gpio_write_pin(LED2_PORT, LED2_PIN, 0); sprintf((char *)tx_buf, "LED ON "); OLED_P8x16Str(0u,4u,(uint8_t *)tx_buf); }else if(cnt == 10) { ald_gpio_write_pin(LED1_PORT, LED1_PIN, 1); ald_gpio_write_pin(LED2_PORT, LED2_PIN, 1); sprintf((char *)tx_buf, "LED OFF"); OLED_P8x16Str(0u,4u,(uint8_t *)tx_buf); cnt = 0; }
dht11_read_data(&temp, &humi); sprintf((char *)tx_buf, "Temp: %d Humi: %d \n", temp, humi); ald_uart_send(&h_uart, tx_buf, sizeof("Temp: %d Humi: %d \n"), 1000);
ald_rtc_get_time(&rtc_v, RTC_FORMAT_DEC); sprintf((char *)tx_buf, "Time:%02d-%02d-%02d", rtc_v.hour, rtc_v.minute, rtc_v.second); OLED_P8x16Str(0u,6u,(uint8_t *)tx_buf);
OLED_P8x16Str(0u,0u,(uint8_t *)"ES32 PDS BOARD"); sprintf((char *)tx_buf, "Temp:%d Humi:%d", temp, humi); OLED_P8x16Str(0u,2u,(uint8_t *)tx_buf); }}
除了免費用開發板
對於測評優秀的玩家
我們還奉上豐盛好禮