|
這個(gè)是建榮藍(lán)牙CW6685_CW6686原理圖、原程式
編譯器用IAR 8051 v7.20H
此版軟件已量產(chǎn)
單片機(jī)源程序如下:
- /*****************************************************************************
- * Module : Main
- * File : main.c
- * Author : Hanny
- * Function : 主函數(shù)
- *****************************************************************************/
- #include "include.h"
- #include "task.h"
- #include "user_spi.h"
- #include "user_fm.h"
- #include "user_fft_led.h"
- #define MSG_POOL_DEPTH 0x20
- u8 msg_pool[MSG_POOL_DEPTH];
- void buck_mode_select(void);
- extern u8 timer5ms_cnt, timer100ms_cnt, timer1s_cnt;
- extern void bt_close(void);
- u8 freq_show_update;
- u8 ocx_show_cnt; //用來控制一些控制的顯示時(shí)間
- u8 dac_vdd_hp_flag;
- void bt_param_init(void);
- bool btdec_load_code(u16 addr, u8 segnum);
- void spctl_init(void);
- void power_down_enter(void);
- void timer_init(void);
- /*
- #pragma vector = VECTOR_OFFSET(RTCC_INT)
- #pragma register_bank=3
- __interrupt __near_func void rtc_isr(void)
- {
- ISR_ENTER();
- if(IRTCON & BIT(5)){
- //IRTCON &= ~BIT(5);
- printf("isxx!!");
- }
- if(IRTCON & BIT(3)){
- //IRTCON &= ~BIT(3);
- printf("isoo!!");
- }
- ISR_EXIT();
- }
- */
- void flush_dispensable_msg(void)
- {
- u8 msg;
- for(u8 i=0; i<MSG_POOL_DEPTH; i++) {
- msg = get_msg();
- if(msg == Q_NOMSG) {
- break;
- } else if(msg >= 0x60 && msg < 0x7e) { //重要的系統(tǒng)消息留下
- put_msg(msg);
- }
- }
- }
- #pragma location="RTC_SEG"
- void rtc_poweron_set(void)
- {
- #if SYS_CRY == CRY_32K
- if(irtcc_read_ram8(FIRST_POWERON_FLAG) == 0xAA) //第一次上電
- {
- irtcc_write_ram8(FIRST_POWERON_FLAG, 0x00);
- //printf("p_set\n");
- memset(&t_time, 0, sizeof(t_time));
- #if 1
- t_time.year = 15;//15;
- t_time.hour = 8;//8;
- t_time.minute = 0;//8;
- t_time.second = 0;
- set_rtc_time(); //初始化為2015年1月1日8:00 //根據(jù)t_time,寫RTC時(shí)間counter
- irtcc_write_rtc(WRITE_ALM,0); //鬧鐘時(shí)間清零
- irtcc_write_ram32(NEXT_ALARM, 0);
- user_set_alarm_time(0,0);
- #else //ALARM TEST, 打開這里,15S會(huì)會(huì)進(jìn)入鬧鐘模式
- t_time.year = 0;//15;
- t_time.hour = 0;//8;
- t_time.minute = 1;
- t_time.second = 45;
- set_rtc_time(); //初始化為2015年1月1日8:00 //根據(jù)t_time,寫RTC時(shí)間counter
- irtcc_write_rtc(WRITE_ALM,2*60); //鬧鐘時(shí)間清零
- irtcc_write_ram32(NEXT_ALARM,2*60);
- user_set_alarm_time(0,2);
- #if ALARM_EN
- user_set_alarm_switch(1); //打開鬧鐘開關(guān)
- #endif
- #endif
- }
- #endif
- }
- #define FIRST_POWER 2 //WRITE_CFG時(shí)注意這一位,用于判斷是否是第一次上電
- #pragma location="RTC_SEG"
- void irtcc_init(void)
- {
- PCON2 &= ~BIT(3);
- u8 cfg =irtcc_read_cfg(READ_CFG);
- u8 wko = irtcc_read_cfg(READ_WKO);
- if((cfg & BIT(FIRST_POWER)) ){ //用于第一次上電的判斷.(PWRCON的BIT7 PD_FLAG讀不出來)
- irtcc_write_ram8(FIRST_POWERON_FLAG, 0xAA);
- irtcc_write_rtc(WRITE_ALM,0); //鬧鐘時(shí)間清零
- irtcc_write_rtc(WRITE_RTC,0); //時(shí)間清零
- //printf("FON\n");
- }else{
- //printf("NF\n");
- }
- //printf("cfg=0x%X\n\n",cfg);
- //printf("wko=0x%X\n\n",wko);
- if(wko & BIT(0)){ //當(dāng)前是鬧鐘喚醒
- sys_ctl.alarm_wakeup_flag = true;
- //printf("WK\n");
- }else{
- sys_ctl.alarm_wakeup_flag = false;
- //printf("NWK\n");
- }
- #if IRTCC_WKUP_EN
- u8 irtcc_cfg = irtcc_read_cfg(WK_STA_RCMD);
- irtcc_write_cfg(WRITE_WKO,0x41); //BIT(6) wko pin output enable BIT(1) WKO pin wakeup enable
- #if SYS_CRY == CRY_32K
- irtcc_write_cfg(WRITE_CFG,0x98);
- #elif SYS_CRY == CRY_12M
- irtcc_write_cfg(WRITE_CFG,0x58); //32K:0x98 12M:0x58
- #endif
- #else
- #if SYS_CRY == CRY_32K
- irtcc_write_cfg(WRITE_CFG,0x88); //here //0x88
- #elif SYS_CRY == CRY_12M
- irtcc_write_cfg(WRITE_CFG,0x48); //32K:0x88 12M:0x48
- //irtcc_write_cfg(OSC_DRV_WCMD,0x51); //12M
- #endif
- #endif
- #if IRTCC_WKUP_EN
- RTC_ALARM_CLR_PEND(); //clear alarm pending
- //RTC_ALARM_INT_EN(); //alarm int enable
- #endif
- }
- #pragma location="INIT_SEG"
- void uart_init_hook(void) //lib中main函數(shù)會(huì)調(diào)用的打印函數(shù)
- {
- #if DEBUG_UART_SEL
- uart_init();
- my_printf_init(uart_putchar);
- #else
- my_printf_init((void (__near_func *)(char))dummy_void);
- #endif
- }
- void sys_var_init(void)
- {
- memset(&sys_ctl, 0, sizeof(sys_ctl)); //在最前面清零
- task_hid_flag = 0;
- bt_low_scan_flag = 0;
- }
- void sys_init(void)
- {
- PCON1 &= ~(BIT(7) | BIT(6) | BIT(2) | BIT(1) | BIT(0));
- PCON2 &= ~(BIT(6));
- PCON3 &= ~BIT(5);
- PCON1 &= ~BIT(7);
- sys_var_init();
- #if SYS_CRY == CRY_32K //使用外接的32k晶振
- sys_pll_x32k();
- #endif
- irtcc_init();
- #if IS_LCD_DISPLAY
- LCD_RESET(); //LCD res 防止出現(xiàn)雪花
- #endif
- user_io_init();
- scan_init(); //初始化掃描控制
- #if BUCK_MODE_EN
- buck_mode_select();
- #else
- if(get_chip_type() == 1){ //CW6686 加大RVDD到最大,改善GFSK,以改善部分芯片通話效果不理想的問題
- PWRCON4 &= ~(BIT(4)|BIT(5)); //set RVDD voltage 00:1.15, 01:1.23, 10:1.28, 11:1.32
- PWRCON4 |= BIT(5);
- PWRCON4 |= BIT(4);
- }
- #endif
- #if !DEBUG_UART_SEL
- uart_disable();
- #endif
- #if IS_LEDSEG_DISPLAY
- ledseg_init();
- ledseg_disp(MENU_POWERON);
- #endif
- led_mode_on();
- timer_init();
- spctl_init();
- #if IS_LCD_DISPLAY
- set_lcd_buf(LCD_FULL_MODE); //設(shè)置初始化顯存
- disp_language_numget();
- lcd_init(); //lcd顯示初始化
- disp_clear();
- disp_draw(RES_POWERON_WELCOME_BMP, 5, 2);
- disp_update();
- LCD_BACKLIGHT_ON();
- #endif
- param_init(); //上電初始化記憶設(shè)備
- rtc_poweron_set();
- #if FFT_LED_EN
- fft_led_init();
- #endif
- msg_init(msg_pool, MSG_POOL_DEPTH);
- device_init();
- #if SD_CMD_REUSE_SD_DETECT
- P3PUS0 &= ~BIT(1);
- #endif
- #if EAR_ADKEY_REUSE
- device_set_delay(DEVICE_EAR,4); //device_set_delay可以更改設(shè)備檢測(cè)的延時(shí)時(shí)間
- #endif
- #if HARD_IR_EN
- ir_hardware_init();
- #elif SOFT_IR_EN
- ir_timer2_init();
- #endif
- sys_ctl.spk_mute = 1;
- timer5ms_cnt = timer100ms_cnt = timer1s_cnt = 0;
- timer1_hook_enable(); //初始化完畢,開啟定時(shí)器擴(kuò)展,以便各項(xiàng)檢測(cè)等。
- dac_init(DAC_INIT_MODE);
- #if DAC_MIX_OUT_EN
- dac_left_right_mix_out();
- #endif
- #if VCMBUF_EN
- uart_disable(); //關(guān)閉串口的使用
- dac_vcmbuf_en(); //使用VCMBUF
- #endif
- flush_msg();
- set_sys_clk(SYS_48M); //初始化完畢,設(shè)置時(shí)鐘
- #if WARNING_POWER_ON
- if (!sys_ctl.mute_flag) {
- sys_unmute();
- }
- dac_enable();
- mp3_res_play_wait(RES_MP3_START); //播放開機(jī)提示音.中調(diào)用的EVENT有可能改變work_sta值
- #endif
- #if TASK_BT_EN
- #if BT_ALL_TASK
- user_bt_init();
- //開始回連
- bt_connect();
- #else
- user_bt_init();
- bt_close();
- #endif
- #endif
- #if ALARM_EN
- if (task_alarm_check()) {
- task_alarm_clear();
- } else {
- if(!sys_ctl.alarm_wakeup_flag){
- task_alarm_set(); //設(shè)置鬧鐘
- }
- }
- next_alarm = irtcc_read_rtc(READ_ALM);
- #endif
- #if IS_LCD_DISPLAY
- sys_ctl.poweroffcnt = 0xffff; // 初始化時(shí)禁止啟動(dòng)定時(shí)關(guān)機(jī)功能
- reset_backlight(); // 背光時(shí)間要重新設(shè)置,不然就初值為0
- #endif
- }
- //軟開關(guān)開機(jī)鍵檢測(cè)
- void soft_power_check(void)
- {
- u16 cnt;
- for (cnt = 500; cnt!=0; cnt--) {
- if (!SOFT_POWER_CHK_IS_ON()) {
- //printf("power_off\n");
- WDTCON = 0;
- SOFT_POWER_CTL_OFF();
- while (1);
- }
- delay(2800);
- }
- //printf("power_on\n");
- SOFT_POWER_CTL_ON();
- }
- #pragma constseg="INIT_CONST"
- IAR_CONST char str_showsid[] = "SID:%lu\n";
- IAR_CONST char str_start[] = "\nStart\n";
- #pragma constseg=default
- #pragma location="INIT_SEG"
- void main(void)
- {
- IE0 = 0; //關(guān)閉所有中斷
- IE1 = 0;
- DPCON = 0;
- IE_EA = 1;
- sys_init();
- run_task();
- while (1);
- }
復(fù)制代碼
所有資料51hei提供下載:
APP.7z
(3.26 MB, 下載次數(shù): 55)
2019-10-22 17:38 上傳
點(diǎn)擊文件名下載附件
原程式 下載積分: 黑幣 -5
CW6685_CW6686 BT Boombox SDK V1.6.pdf
(5.74 MB, 下載次數(shù): 68)
2019-10-22 08:44 上傳
點(diǎn)擊文件名下載附件
原理圖 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|