AC104X软件问题整理
AC104X软件问题整理
链接:
提取码:
以下是杰理客户问题反馈的二维码图片,可以通过微信扫二维码填写反馈!
也可以通过访问链接填写反馈: HYPERLINK "https://www.wjx.cn/vj/O1EbvrN.aspx" https://www.wjx.cn/vj/O1EbvrN.aspx
我们将第一时间安排对应工程协助解决!
杰理开源社区国内仓库https://gitee.com/Jieli-Tech
HYPERLINK "https://gitee.com/Jieli-Tech/fw-AD15N/issues" https://gitee.com/Jieli-Tech/fw-AD15N/issues 这里有一些社区开发者的问题反馈,遇到问题可以先去这里看看。
TOC \o "2-2" \h \u HYPERLINK \l _Toc8086 1. 串口设置好以后打印乱码,内部晶振没有校准,需要加下下面这段代码-210610hxw PAGEREF _Toc8086 3
HYPERLINK \l _Toc3105 2.强制升级-210610hxw PAGEREF _Toc3105 3
HYPERLINK \l _Toc22185 3.DAC输出方式设置,可以选择模拟输出和PWM输出-210610hxw PAGEREF _Toc22185 3
HYPERLINK \l _Toc32267 4.SD卡IO设置-210610hxw PAGEREF _Toc32267 4
HYPERLINK \l _Toc3237 5.播MP3提示音功能-210610 hxw -2021-10-8 WGH完善 PAGEREF _Toc3237 5
HYPERLINK \l _Toc17798 6.V102版本SDK播放变调-210610hxw PAGEREF _Toc17798 10
HYPERLINK \l _Toc21508 7.进入soft off后插拔sd卡会复位-210610hxw PAGEREF _Toc21508 11
HYPERLINK \l _Toc1947 8.添加定时器中断-210610hxw PAGEREF _Toc1947 12
HYPERLINK \l _Toc28757 9.输出3路PMW-210610hxw PAGEREF _Toc28757 13
HYPERLINK \l _Toc2459 10.V102版本SDK加FLASH连电脑传文件和播放-210610hxw PAGEREF _Toc2459 15
HYPERLINK \l _Toc27037 11.无缝循环播放210702hxw PAGEREF _Toc27037 16
HYPERLINK \l _Toc5002 12.AD系列MIDI功能使用说明-210705hxw PAGEREF _Toc5002 17
HYPERLINK \l _Toc3995 13.串口通信 串口接收IO需要设置数字功能-210715hxw PAGEREF _Toc3995 18
HYPERLINK \l _Toc26314 14.增加一个输入捕捉通道-210729hxw PAGEREF _Toc26314 18
HYPERLINK \l _Toc5187 15.睡眠以后定时唤醒系统继续跑不复位-210730hxw PAGEREF _Toc5187 23
HYPERLINK \l _Toc29497 16.检测MIC能量自动录音自动播放参考-210809hxw PAGEREF _Toc29497 24
HYPERLINK \l _Toc24295 17.V104以前的SDK可能出现有些芯片音乐播放速度快-210902hxw PAGEREF _Toc24295 25
HYPERLINK \l _Toc1564 18.编译提示FW文件工具需要更新-210902hxw PAGEREF _Toc1564 25
- 串口设置好以后打印乱码,内部晶振没有校准,需要加下下面这段代码-210610hxw 生产烧录的时候要屏蔽这段
int c_main(int cfg_addr)
{
#if 1
/debug code/
JL_PLL->CON1 = 0XA403730; //me
// JL_PLL->CON1 = 0XA40372d; //卓豪
JL_PLL->CON1 = 0XA403724; //测试部
JL_PLL->CON0 |= BIT(0);//EN
volatile int i=0;
for(i=0; i<0xfffff; i++);
JL_PLL->CON0 |= BIT(1);//RST
for(i=0; i<0xfffff; i++);
/******
2.强制升级-210610hxw
用4.0版本升级工具把第二档搬上去。如果还不行就把升级工具升级到最新版本。
3.DAC输出方式设置,可以选择模拟输出和PWM输出-210610hxw
#define DAC_MODE_1_A ( DAC_PWM ) //PWM
// 以下DSM模式暂时皆不可用
// #define DAC_MODE_1_B ( DAC_DSM | DAC_DSM11 )
// #define DAC_MODE_1_C ( DAC_DSM | DAC_DSM2 )
// #define DAC_MODE_1_D ( DAC_DSM | DAC_DSM3 )
// #define DAC_MODE_2_A ( DAC_DSM | DAC_DSM7 )
// #define DAC_MODE_3_A ( DAC_PWM )
// #define DAC_MODE_3_B ( DAC_DSM | DAC_DSM11 )
// #define DAC_MODE_3_C ( DAC_DSM | DAC_DSM2 )
// #define DAC_MODE_3_D ( DAC_DSM | DAC_DSM3 )
// #define DAC_MODE_4_A ( DAC_DSM | DAC_DSM2)
#define DAC_MODE_5_A ( DAC_DSM | DAC_DSM7) //模拟信号
#define DAC_CURR_MODE DAC_MODE_5_A
4.SD卡IO设置-210610hxw
芯片内部只有一组卡口,不管选择那组卡口SDMMCA_EN不需要修改。
在这里设置sd卡。
//SH54:
//SD A组IO: CMD:PA02 CLK:PA01 DAT:PA03
//SD B组IO: CMD:PA12 CLK:PA11 DAT:PA10
//SD C组IO: CMD:PA05 CLK:PA04 DAT:USBDM
//SD D组IO: CMD:PA05 CLK:PA04 DAT:PA06
//SH55:
//SD A组IO: CMD:PA02 CLK:PA01 DAT:PA03
//SD B组IO: CMD:PB01 CLK:PB00 DAT:PB02
//SD C组IO: CMD:PB05 CLK:PB04 DAT:PB06
//SD D组IO: CMD:PA07 CLK:PA06 DAT:PA08
#if TFG_SD_EN
SD0_PLATFORM_DATA_BEGIN(sd0_data)
.port = 'B',
.data_width = 1,
.speed = 8000000,
#if 0 //CMD检测
.detect_mode = SD_CMD_DECT,
.detect_func = sdmmc_0_cmd_detect,
#endif
#if 1 //CLK检测
.detect_mode = SD_CLK_DECT,
.detect_func = sdmmc_0_clk_detect,
.detect_io_level = 0,//0:低电平检测到卡 1:高电平检测到卡
#endif
#if 0 //IO检测
.detect_mode = SD_IO_DECT,
.detect_func = sdmmc_0_io_detect,
.detect_io = IO_PORTx_xx,//用于检测的引脚
.detect_io_level = x,//0:低电平检测到卡 1:高电平检测到卡
#endif
.power = NULL,
.priority = 3,
SD0_PLATFORM_DATA_END()
#endif
5.播MP3提示音功能-210610 hxw -2021-10-8 WGH完善
5.1
先用资源文件打包工具把提示音打包成一个文件,拿到新的打包工具,参考以下放大做成打包好的文件。
该问题可以找杰理HXW要

最终会将pc.mp3打包进到TONE_SL
5.2 在批处理里面加上刚才做好的文件
5.3打开FLASH里面文件的接口SDK默认就有,改成自己的目录即可。打开文件成功以后用文件句柄调用开始解码。解码结束以后需要释放资源!


#if 1
#define vfs_demo_show(ptr,err) \
log_info("Demo 0x%x : %s",err,ptr); \
if(0 != err){ \
return ; \
}
extern dec_obj *decoder_io(void *pfile, u32 dec_ctl, dp_buff *dbuff, u8 loop);
static u8 demo_buff[512];
extern bool user_start_decode(void *pvfile);
extern bool start_decode(bool break_point);
extern void stop_decode(void);
extern u16 app_get_msg(void);
extern int bsp_loop(void);
void *tone_pvfs = 0;
void *tone_pvfile = 0;
void vfs_stop_tone(void);
void vfs_play_tone(void)
{
u32 err;
int play_err;
log_info("vfs init !!!\n");
vfs_init();
log_info("vfs init finish !!!\n");
err = vfs_mount(&tone_pvfs, (void *)NULL, (void *)NULL);
vfs_demo_show("vfs_mount\n", err);
err = vfs_openbypath(tone_pvfs, &tone_pvfile, "/TONE_SL/pc.mp3");
vfs_demo_show("vfs_openbypath\n", err);
// err = vfs_read(tone_pvfile, demo_buff, 512);
log_info("vfs read len : %d\n", err);
// log_info_hexdump(demo_buff, 512);
log_info(">>vfs_demo-tone_pvfile:%x \n", (u32)tone_pvfile);
user_start_decode(tone_pvfile);
// os_time_dly(230);
// vfs_stop_tone();
return;
}
void vfs_stop_tone(void)
{
stop_decode();
log_info("dly end\n");
vfs_file_close(&tone_pvfile);
log_info("vfs_file_close\n");
vfs_fs_close(&tone_pvfs);
log_info("vfs_fs_close\n");
}
void vfs_tone_loop(void)
{
u16 msg;
log_info("vfs_tone_loop \n");
while (1) {
msg = app_get_msg();
bsp_loop();
switch (msg) {
case MSG_WAV_FILE_END:
case MSG_MP3_FILE_END:
case MSG_F1A1_FILE_END:
case MSG_F1A2_FILE_END:
case MSG_MIDI_FILE_END:
case MSG_DECODE_FILE_END:
log_info("decoder end>>>>>>>>>>>>>>>>>>>>>>>> msg = %d\n",msg);
vfs_stop_tone();
return;
default:
break;
}
}
}
#endif
6.V102版本SDK播放变调-210610hxw
关掉工程选项里面的MIO
7.进入soft off后插拔sd卡会复位-210610hxw
SD供电串联电阻加大(4.7欧姆),另外VDDIO电源电容加大(106).soft off的时候 vddio 电流档会变弱,会可能出现拉电复位的情况。
8.添加定时器中断-210610hxw
注意中断函数放在RAM里面,客户自己加的代码不要太多否则RAM不够。
attribute((weak))
AT(.tick_timer_code)
void user_timer2_ram_loop(void)
{
// putchar('1');
}
void user_timer2_loop(void){
}
SET(interrupt(""))
AT(.tick_timer_code)
void user_timer2_isr()
{
/*
*用户的timer函数不能加入到这里,加到tick_timer_loop
* */
//bit_clr_swi(TIME0_INIT);
JL_TMR2->CON |= BIT(6);
user_timer2_ram_loop();
// user_timer2_loop();
}
void user_timer2_init(void)
{
tt_printf("----user_timer2_init \n");
HWI_Install(IRQ_TIME2_IDX, (u32)user_timer2_isr, IRQ_IRTMR_IP) ; //timer0_isr
JL_TMR2->CNT = 0X00;
JL_TMR2->PRD = (sys_clock_get() / 1000) * 2;
JL_TMR2->CON |= BIT(0);
tt_printf("user_timer2_init--end \n");
}
9.输出3路PMW-210610hxw
user_pwm_init(IO_PORTA_14,100 ,0,1);
user_pwm_init(IO_PORTA_05,200 ,1,0);
user_pwm_init(IO_PORTA_07,150 ,2,1);
#define PWM_FRE 3000
void user_pwm_init(u32 port,u16 pwm_wide,u32 pwn_chl,bool output)
{
#if 1
log_info("mio pwm init -> pwn_chl : %d\n", pwn_chl);
switch (pwn_chl)
{
case 0:
if(output){
SFR(JL_IOMC->IOMC3, 0, 3, 0); //输出到OUTPUT 0
// IO选择输出OUTPUT信号
gpio_set_pull_up(port, 1);
gpio_set_pull_down(port, 1);
gpio_set_direction(port, 0);
gpio_set_die(port, 0);
}else{
gpio_set_direction(port, 0);
gpio_set_die(port, 1);
SFR(JL_IOMC->IOMC0, 16, 1, 1); //输出到PWM默认IO
}
JL_PWM->TMR0_PR = sys_clock_get() / PWM_FRE;
JL_PWM->CH0_CMP = (sys_clock_get() / PWM_FRE) * pwm_wide / 255; //pwm_var范围在0-255
JL_PWM->TMR0_CON = BIT(5);
break;
case 1:
if(output){
gpio_set_pull_up(port, 1);
gpio_set_pull_down(port, 1);
gpio_set_direction(port, 0);
SFR(JL_IOMC->IOMC3, 0, 3, 1);
gpio_set_die(port, 0);
}else{
gpio_set_direction(port, 0);
gpio_set_die(port, 1);
SFR(JL_IOMC->IOMC0, 17, 1, 1);
}
JL_PWM->TMR1_PR = sys_clock_get() / PWM_FRE;
JL_PWM->CH1_CMP = (sys_clock_get() / PWM_FRE) * pwm_wide / 255; //pwm_var范围在0-255
JL_PWM->TMR1_CON = BIT(5);
break;
case 2:
if(output){
gpio_set_pull_up(port, 1);
gpio_set_pull_down(port, 1);
gpio_set_direction(port, 0);
SFR(JL_IOMC->IOMC3, 3, 3, 0);
gpio_set_die(port, 1);
}else{
gpio_set_direction(port, 0);
gpio_set_die(port, 1);
SFR(JL_IOMC->IOMC0, 18, 1, 1);
}
JL_PWM->TMR2_PR = sys_clock_get() / PWM_FRE;
JL_PWM->CH2_CMP = (sys_clock_get() / PWM_FRE) * pwm_wide / 255; //pwm_var范围在0-255
JL_PWM->TMR2_CON = BIT(5);
break;
case 3:
if(output){
gpio_set_pull_up(port, 1);
gpio_set_pull_down(port, 1);
gpio_set_direction(port, 0);
SFR(JL_IOMC->IOMC3, 3, 3, 1);
gpio_set_die(port, 1);
}else{
gpio_set_direction(port, 0);
gpio_set_die(port, 1);
SFR(JL_IOMC->IOMC0, 19, 1, 1);
}
JL_PWM->TMR3_PR = sys_clock_get() / PWM_FRE;
JL_PWM->CH3_CMP = (sys_clock_get() / PWM_FRE) * pwm_wide / 255; //pwm_var范围在0-255
JL_PWM->TMR3_CON = BIT(5);
break;
default:
break;
}
SFR(JL_PWM->PWMCON1, (1 + pwn_chl * 4), 3, pwn_chl);
JL_PWM->PWMCON0 |= BIT(8 + pwn_chl);
JL_PWM->PWMCON0 |= BIT(pwn_chl);
#else
u8 chl = pwn_chl;
#define MIO_API_PWM_PORT IO_PORTA_05
#define PWM_FRE 3000
log_info("mio pwm init -> chl : %d\n", chl);
// gpio_set_pull_up(MIO_API_PWM_PORT, 1);
// gpio_set_pull_down(MIO_API_PWM_PORT, 1);
// SFR(JL_IOMC->IOMC3, 0, 3, 0);
gpio_set_direction(MIO_API_PWM_PORT, 0);
gpio_set_die(MIO_API_PWM_PORT, 0);
JL_PWM->TMR0_PR = sys_clock_get() / PWM_FRE;
JL_PWM->CH0_CMP = (sys_clock_get() / PWM_FRE) * 199 / 255; //pwm_var范围在0-255
SFR(JL_PWM->PWMCON1, (1 + chl * 4), 3, chl);
JL_PWM->TMR0_CON = BIT(5);
JL_PWM->PWMCON0 |= BIT(8 + chl);
JL_PWM->PWMCON0 |= BIT(chl);
#endif
}
10.V102版本SDK加FLASH连电脑传文件和播放-210610hxw
参考程序 HYPERLINK "https://pan.baidu.com/s/1kqKmgIAU_QZYMko-wm5TNA" \t "_blank" https://pan.baidu.com/s/1kqKmgIAU_QZYMko-wm5TNA
提取码:8888
11.无缝循环播放210702hxw
最后一个参数设置255 一直循环。
dec_obj *decoder_io(void *pfile, u32 dec_ctl, dp_buff *dbuff, u8 loop)
如果是AD14或者AD15 还要在音频原文件要在转换的时候选上无缝循环的选项。
INCLUDEPICTURE \d "C:\Users\SPC20-001\AppData\Roaming\Tencent\Users\271964349\QQ\WinTemp\RichOle\98OBNUK36(AS)$PD2Y_6S.png" * MERGEFORMATINET
开了断点记忆和无限循环在上播断点的时候会从断点的位置开始到结束一直循环。需要按照下面修改。
#if 0
clear_dp(dbuff);
if (0 != loop) { // (dec_ctl & BIT_LOOP)
p_dec->loop = loop;
log_info("get loop dp\n");
if (true == get_dp(p_dec, dbuff)) {
log_info(" -loop save succ!\n");
p_dec->p_dp_buf = check_dp(dbuff);
} else {
log_info(" -loop save fail!\n");
}
}
#else
u8 MUSIC_PLAY_FROM_START = (check_dp(dbuff) == 0);
clear_dp(dbuff);
if (0 != loop) { // (dec_ctl & BIT_LOOP)
static dp_buff loop_dbuff;
p_dec->loop = loop;
if (MUSIC_PLAY_FROM_START)
{
log_info("get loop dp********\n");
if (true == get_dp(p_dec, &loop_dbuff)) {
vm_write(VM_LOOP_BP,(u8 *)&loop_dbuff,sizeof(dp_buff));
p_dec->p_dp_buf = check_dp(&loop_dbuff);
} else {
log_info(" -loop save fail!\n");
}
}
else
{
log_info("************get loop bp from vm ************\n");
vm_read(VM_LOOP_BP,(u8 *)&loop_dbuff,sizeof(dp_buff));
p_dec->p_dp_buf = check_dp(&loop_dbuff);
}
}
#endif
如果是AC104下面这里需要修改,解决断点和循环冲突的问题。

12.AD系列MIDI功能使用说明-210705hxw
链接: HYPERLINK "https://pan.baidu.com/s/1aRIafU0LSYlxhKWw8GZbNA" \t "_blank" https://pan.baidu.com/s/1aRIafU0LSYlxhKWw8GZbNA 提取码:8888
13.串口通信 串口接收IO需要设置数字功能-210715hxw

14.增加一个输入捕捉通道-210729hxw
AC104 103版本SDK的红外用到了TIMER2和IRFLT模块。IRFLT只是相当于一个信号过滤的模块,对于脉冲宽度的测量实际还是通过TIMER来实现的。
这里增加了TIMER0用默认的PA13来检测脉宽。
// 根据封装修改IO和timer
// 注意红外默认用的是TIMER2 的映射通道
// TIMER0默认输入捕捉IO PA13
// TIMER1默认输入捕捉IO PA09
// TIMER2默认输入捕捉IO PA01
#define USER_CAP_IO IO_PORTA_13 //timer默认的io 需要映射可以参考红外按键
#define USER_CAP_TMR JL_TMR0
#define IRQ_USER_CAP_TMR IRQ_TIME0_IDX
#define INPUT_CHANNLE0_SRC_SEL(x) SFR(JL_IOMC->IOMC2, 0, 5, x)
#define CAP_TIMER_SEL(x) SFR(JL_IOMC->IOMC1, 4, 2, x)
u16 user_cap_prd;
static const u16 timer_div[] = {
/0000/ 1,
/0001/ 4,
/0010/ 16,
/0011/ 64,
/0100/ 2,
/0101/ 8,
/0110/ 32,
/0111/ 128,
/1000/ 256,
/1001/ 4 * 256,
/1010/ 16 * 256,
/1011/ 64 * 256,
/1100/ 2 * 256,
/1101/ 8 * 256,
/1110/ 32 * 256,
/1111/ 128 * 256,
};
/----------------------------------------------------------------------------/
/**@brief time1红外中断服务函数
@param void
@param void
@return void
@note void timer1_ir_isr(void)
/
/----------------------------------------------------------------------------*/
static u32 data_temp = 0;
static u8 cnt_temp = 0;
___interrupt
static void user_cap_isr(void)
{ //采样中不能在中断里面加打印
u16 bCap1;
u8 cap = 0;
static u8 cnt = 0;
USER_CAP_TMR->CON |= BIT(6);
bCap1 = USER_CAP_TMR->PRD;
USER_CAP_TMR->CNT = 0;
cap = bCap1 / user_cap_prd;
if (cap <= 1) {
data_temp >>= 1;
cnt_temp++;
} else if (cap <= 3){
data_temp >>= 1;
cnt_temp++;
data_temp |= 0x8000;
}else if ((cap == 13) && (cnt_temp < 8)){
data_temp = 0;
cnt_temp= 0;
}
if (cnt_temp == 32) {
log_info("data_temp:%x\n",data_temp );
}
}
void user_cap_outtime(void)
{
static u8 wait_cnt = 0;
if(cnt_temp){
wait_cnt++;
if(wait_cnt > 20){
wait_cnt = 0;
data_temp = 0;
cnt_temp= 0;
}
}
}
/----------------------------------------------------------------------------/
/**@brief ir按键初始化
@param void
@param void
@return void
@note void set_ir_clk(void)
((cnt - 1)* 分频数)/lsb_clk = 1ms
/
/----------------------------------------------------------------------------*/
#define OSC_Hz 12000000L
// 根据实际要捕捉的信号频率调整TIMER的分频和prd_cnt
/* #define MAX_TIME_CNT 0x07ff //分频准确范围,更具实际情况调整 /
/ #define MIN_TIME_CNT 0x0030 /
void user_cap_timer_init(void)
{
u32 clk;
u32 prd_cnt;
/ u8 index; */
clk = OSC_Hz;//clock_get_lsb_freq();
clk /= (1000 * 64);
clk *= 1; //1ms for cnt
prd_cnt = clk;
user_cap_prd = prd_cnt;
USER_CAP_TMR->CON = BIT(6);
USER_CAP_TMR->PRD = 0;
USER_CAP_TMR->CNT = 0;
USER_CAP_TMR->CON = ((3 << 4) | (2 << 2) | (3 << 0)); //htc + falling edge
}
static void user_cap_io_init(void){
gpio_set_direction(USER_CAP_IO, 1);
gpio_set_die(USER_CAP_IO, 1);
gpio_set_pull_up(USER_CAP_IO, 1);
}
/----------------------------------------------------------------------------/
/**@brief ir按键初始化
@param void
@param void
@return void
@note void ir_key_init(void)
/
/----------------------------------------------------------------------------*/
int user_cap_init(void )
{
//timer1
r_printf("ir key init >>>\n");
request_irq(IRQ_USER_CAP_TMR, IRQ_IRTMR_IP, user_cap_isr, 0);
user_cap_io_init(); //初始化输入捕捉的IO
user_cap_timer_init(); //设置定时器
return 0;
}
15.睡眠以后定时唤醒系统继续跑不复位-210730hxw
早期SDK做不了要这些版本才可以用
AC104 V104和以上版本
AD14 V106和以上版本
AD15V106和以上版本
sys_power_down(nuS)
调用这个函数单位是微秒。注意如果开了看门狗最大只能设置看门狗复位时长的一半,如果传入的参数超过看门狗复位时间的一半不会生效。如果需要设置更长可以关闭看门狗。
注意AD14 v106 A0版本外挂FLASH默认SDK进入睡眠以后无法唤醒需要做以下修改
1.换库 HYPERLINK "https://pan.baidu.com/s/1iCQwIyyKY2GZ623m9XxoDg" \t "_blank" https://pan.baidu.com/s/1iCQwIyyKY2GZ623m9XxoDg 提取码8888
2.改这个宏
16.检测MIC能量自动录音自动播放参考-210809hxw
参考代码位置 HYPERLINK "https://pan.baidu.com/s/1EvdvoljdAqrrC5gdC1m1nQ" \t "_blank" https://pan.baidu.com/s/1EvdvoljdAqrrC5gdC1m1nQ 提取码8888
1.增加了一个ms模式,开机默认进入app_ms.
2.检测能量自动开始录音,检测到没有说话声音以后自动播放刚才的录音。
3.上述代码只是一个参考,用来告诉客户LADC采样的数据怎样计算,怎样控制录音和播放录音。具体开始和结束的阈值需要客户自己调整,或者客户可以重写整个判断开始结束的函数。

17.V104以前的SDK可能出现有些芯片音乐播放速度快-210902hxw
换掉uboot文件重新编译或者升级到V104版本SDK。
压缩包里面有一个EXE工具如果只有FW文件找不到代码了可以用这个工具直接生成新的FW文件。
链接: https://pan.baidu.com/s/1aoAkZLo0t0XqYgyEZiXp0w 提取码: n2wy
18.编译提示FW文件工具需要更新-210902hxw

双击这个下载新的工具即可
INCLUDEPICTURE \d "C:\Users\SPC20-001\AppData\Roaming\Tencent\Users\271964349\QQ\WinTemp\RichOle\L%LG(VIBH)C~7R~M91F`4$2.png" * MERGEFORMATINET