1400 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1400 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* os shim includes */
 | ||
| #include "os_types.h"
 | ||
| #include "dbg_io.h"
 | ||
| #include "iot_io.h"
 | ||
| #include "gpio_mtx.h"
 | ||
| #include "pwm.h"
 | ||
| #include "cpu.h"
 | ||
| #include "watchdog.h"
 | ||
| 
 | ||
| #include "ahb.h"
 | ||
| #include "gp_timer.h"
 | ||
| #include "iot_clock.h"
 | ||
| 
 | ||
| #include "dtest_printf.h"
 | ||
| #include "iot_gpio_api.h"
 | ||
| 
 | ||
| void delay_sometime(uint32_t times)
 | ||
| {
 | ||
|     uint32_t loop = 0;
 | ||
| 
 | ||
|     while (loop++ < times) {
 | ||
|         __asm volatile ("nop\n");
 | ||
|     }
 | ||
| }
 | ||
| #include <stdlib.h>
 | ||
| #include <string.h>
 | ||
| char g_str_buf[64];
 | ||
| 
 | ||
| 
 | ||
| char * binary_format(char *str, char *dest, int destlen)
 | ||
| {
 | ||
|     int srclen = strlen(str);
 | ||
|     int d = destlen - 1;
 | ||
|     int f = 0;
 | ||
| 
 | ||
| //    printf("strlen=%d, d = %d\r\n", srclen, d);
 | ||
| 
 | ||
|     dest[d--] = 0;
 | ||
| 
 | ||
|     for(int i = srclen - 1; i >= 0; i--)
 | ||
|     {
 | ||
|         dest[d--] = str[i];
 | ||
|         f ++;
 | ||
|         if (f % 4 == 0) {
 | ||
|             dest[d--] = '-';
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     d ++;
 | ||
|     if('-' == dest[d]) {
 | ||
|         d ++;
 | ||
|     }
 | ||
| 
 | ||
| //    printf("len=%d\r\n", (int)strlen(dest + d));
 | ||
| 
 | ||
|     return dest + d;
 | ||
| }
 | ||
| 
 | ||
| void print_pos(int offset, int len)
 | ||
| {
 | ||
|     int pos = 0;
 | ||
| 
 | ||
|     if (len <= 5) {
 | ||
|         pos = 0;
 | ||
|     } else if(len <= 10) {
 | ||
|         pos = 4;
 | ||
|     } else if(len <= 15) {
 | ||
|         pos = 8;
 | ||
|     } else if(len <= 20) {
 | ||
|         pos = 12;
 | ||
|     } else if(len <= 25) {
 | ||
|         pos = 16;
 | ||
|     } else if(len <= 30) {
 | ||
|         pos = 20;
 | ||
|     } else if(len <= 35) {
 | ||
|         pos = 24;
 | ||
|     } else if(len <= 40) {
 | ||
|         pos = 28;
 | ||
|     }
 | ||
|     for (int i = 0; i < offset; i++) {
 | ||
|         iot_printf(" ");
 | ||
|     }
 | ||
| 
 | ||
|     for(int j = 0; j < len; j += 5)
 | ||
|     {
 | ||
|         iot_printf("% 5d", pos);
 | ||
|         pos -= 4;
 | ||
|     }
 | ||
|     iot_printf("\r\n");
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void register_print_by_addr(uint32_t addr, int num)
 | ||
| {
 | ||
|     volatile uint32_t *p_addr = (volatile uint32_t *)addr;
 | ||
|     int i;
 | ||
|     char s[32];
 | ||
|     char *p;
 | ||
| 
 | ||
|     for (i = 0; i < num; i++) {
 | ||
|         itoa(*p_addr, s, 2);
 | ||
| 
 | ||
|         p = binary_format(s, g_str_buf, 64);
 | ||
| 
 | ||
|         iot_printf("[%08p]=0x%08x,%s\r\n", p_addr, *p_addr, p);
 | ||
|         print_pos(1, strlen(p));
 | ||
|         p_addr ++;
 | ||
|     }
 | ||
|     iot_printf("\r\n");
 | ||
| }
 | ||
| 
 | ||
| void AQ_set(int ch, uint8_t mode)
 | ||
| {
 | ||
|     if (TB_COUNT_UP == mode) {
 | ||
|         pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     } else if(TB_COUNT_DOWN == mode) {
 | ||
|         pwm_aqctla_set(ch, AQ_CLEAR, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_SET, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_aqctlb_set(ch, AQ_CLEAR, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_NOTHING, AQ_NOTHING, AQ_SET);
 | ||
| 
 | ||
|     } else if(TB_COUNT_UP_DOWN == mode) {
 | ||
|         pwm_aqctla_set(ch, AQ_NOTHING, AQ_NOTHING,
 | ||
|             AQ_SET, AQ_CLEAR, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_aqctlb_set(ch, AQ_CLEAR, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_NOTHING, AQ_SET, AQ_CLEAR);
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| #include "gpio_hw.h"
 | ||
| 
 | ||
| extern iot_gpio_op_t hw_gpio_api_table;
 | ||
| 
 | ||
| 
 | ||
| #if 0
 | ||
| 
 | ||
| #define pwm_inter_cb_def(ch) \
 | ||
| uint32_t pwm_ch##ch##_intr_cb(void) \
 | ||
| { \
 | ||
|     static int times##ch = -1; \
 | ||
|     times##ch ++; \
 | ||
|     if (times##ch % 1000 == 0) { \
 | ||
|         iot_printf("times%d=%d\r\n", ch, times##ch); \
 | ||
|     } \
 | ||
|     return 0; \
 | ||
| }
 | ||
| 
 | ||
| pwm_inter_cb_def(0)
 | ||
| #else
 | ||
| 
 | ||
| #define pwm_inter_cb_def(ch) \
 | ||
| uint32_t pwm_ch##ch##_intr_cb(void) \
 | ||
| { \
 | ||
|     return 0; \
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| uint32_t pwm_ch0_intr_cb(void)
 | ||
| {
 | ||
|     static int v = 0;
 | ||
|     hw_gpio_api_table.set_value(8, v);
 | ||
|     v ^= 0x01;
 | ||
|     return 0;
 | ||
| }
 | ||
| #endif
 | ||
| 
 | ||
| pwm_inter_cb_def(1)
 | ||
| pwm_inter_cb_def(2)
 | ||
| pwm_inter_cb_def(3)
 | ||
| pwm_inter_cb_def(4)
 | ||
| pwm_inter_cb_def(5)
 | ||
| 
 | ||
| uint32_t (*cb_table[4])(void) ={
 | ||
|     pwm_ch0_intr_cb,
 | ||
|     pwm_ch1_intr_cb,
 | ||
|     pwm_ch2_intr_cb,
 | ||
|     pwm_ch3_intr_cb,
 | ||
| 
 | ||
| };
 | ||
| 
 | ||
| 
 | ||
| extern void pwm_set_etps(uint8_t ch, uint8_t int_prd, uint8_t soca_prd, uint8_t socb_prd);
 | ||
| //该case测试多通道周期,占空比同步加载;中断及中断分频;死区
 | ||
| void all_pwm_module_sync_test_with_intc(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
|     uint32_t pwm_phase[4] = {1000, 2000, 3000, 4000};
 | ||
| 
 | ||
|     uint32_t pwm_duty[4][2]={{5000,10000},
 | ||
|                              {5000,10000},
 | ||
|                              {5000,10000},
 | ||
|                              {5000,10000},
 | ||
|     };
 | ||
|     uint8_t pwm_gpio[4][2] = {
 | ||
|                              {58, 59},
 | ||
|                              {60, 61},
 | ||
|                              {62, 63},
 | ||
|                              {26, 36},//8},
 | ||
|     };
 | ||
| 
 | ||
|     bool_t test_inter = true; //是否测试中断
 | ||
| 
 | ||
|     uint8_t counter_modes[4]={TB_COUNT_UP, TB_COUNT_UP, TB_COUNT_UP, TB_COUNT_UP};
 | ||
|     //uint8_t counter_modes[4]={TB_COUNT_DOWN, TB_COUNT_DOWN, TB_COUNT_DOWN, TB_COUNT_DOWN};
 | ||
|     //uint8_t counter_modes[4]={TB_COUNT_UP_DOWN, TB_COUNT_UP_DOWN, TB_COUNT_UP_DOWN, TB_COUNT_UP_DOWN};
 | ||
|     uint32_t cpu_id = cpu_get_mhartid();
 | ||
| 
 | ||
| 
 | ||
|     iot_interrupt_init(cpu_id);
 | ||
| 
 | ||
| //
 | ||
|     int pin = 8;
 | ||
|     hw_gpio_api_table.gpio_init();
 | ||
|     gpio_pin_select(pin, 0);
 | ||
|     hw_gpio_api_table.set_gpio_mode(pin, GPIO_OUTPUT);
 | ||
| 
 | ||
| 
 | ||
| //
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
|     for(ch = PWM_CHANNEL_0; ch <= PWM_CHANNEL_3; ch ++) {
 | ||
|         pwm_synci_in_config(7);
 | ||
|         if (test_inter) {
 | ||
|             pwm_gpio_config_with_isr(ch, pwm_gpio[ch][0], pwm_gpio[ch][1], cb_table[ch]);
 | ||
|             pwm_set_etps(ch, 50, 0, 0); //设置中断得分频
 | ||
|         } else {
 | ||
|             pwm_gpio_config(ch, pwm_gpio[ch][0], pwm_gpio[ch][1]);
 | ||
| 
 | ||
|         }
 | ||
|         pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|         pwm_tb_phase_set(ch, pwm_phase[ch]);
 | ||
|         pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
| 
 | ||
|         //pwm waveform period
 | ||
|         pwm_tb_period_set(ch, 99999);
 | ||
| 
 | ||
|         pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|         AQ_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|         pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|         pwm_cnt_mode_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|         pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMB_RAW);
 | ||
|         pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B不反相
 | ||
|         pwm_db_outmode_set(ch, DB_OUTMODE_DELAYED, DB_OUTMODE_DELAYED ); //都产生死区
 | ||
| 
 | ||
|         pwm_db_rising_delay_set(ch, 10);
 | ||
|         pwm_db_falling_delay_set(ch, 20);
 | ||
|         pwm_tb_cnt_set(ch, 0);
 | ||
|         pwm_cnt_start(ch, true);
 | ||
|         pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     pwm_cnt_soc_sync_load();
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
|     int prd = 9999;
 | ||
| 
 | ||
|     int v = 0;
 | ||
|     int v2 = 0;
 | ||
|     while (1) {
 | ||
|         //频率=10k
 | ||
| 
 | ||
|         v2 = ~v2;
 | ||
|         if (v2) { //改变周期
 | ||
|             prd = 9999;
 | ||
|         } else {
 | ||
|             prd = 999;
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         memset(pwm_duty, 0, sizeof(pwm_duty));
 | ||
|         for(int j = 0; j < 10; j++) { // //以prd为周期分10次改变占空比
 | ||
| 
 | ||
|             for (ch = PWM_CHANNEL_0; ch <= PWM_CHANNEL_3; ch++) {
 | ||
|                 pwm_duty[ch][0] += prd / 10 + 1;
 | ||
|                 pwm_duty[ch][1] += prd / 10 + 1;
 | ||
| 
 | ||
|                 if (pwm_duty[ch][0] >= prd) {
 | ||
|                     pwm_duty[ch][0] = prd / 10;
 | ||
|                 }
 | ||
|                 if (pwm_duty[ch][1] >= prd) {
 | ||
|                     pwm_duty[ch][1] = prd / 10;
 | ||
|                 }
 | ||
|                 pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
|                 delay_sometime(100);
 | ||
|                 pwm_tb_period_set(ch, prd);
 | ||
| 
 | ||
|             }
 | ||
|             delay_sometime(100);
 | ||
| 
 | ||
|             pwm_cnt_soc_sync_load();
 | ||
| 
 | ||
|             //hw_gpio_api_table.set_value(pin, v);
 | ||
|             v ^= 0x01;
 | ||
|             delay_sometime(100000);
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| void counter_modes_test(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
|     uint32_t pwm_phase[4] = {1000, 2000, 3000, 4000};
 | ||
|     uint32_t pwm_duty[4][2]={{500,1000},
 | ||
|                              {1500,2000},
 | ||
|                              {2500,3000},
 | ||
|                              {3500,4000},
 | ||
|     };
 | ||
|     uint8_t counter_modes[4]={TB_COUNT_UP, TB_COUNT_DOWN, TB_COUNT_STOP_FREEZE, TB_COUNT_UP_DOWN};
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
| //                 UART R1
 | ||
|     pwm_synci_in_config(7);
 | ||
| //                     t1   t2
 | ||
|     pwm_gpio_config(ch, 8, 36);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[0]);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_DISABLE,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_NO_SHADOW, CC_NO_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     AQ_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMB_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B反相
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS ); //都不产生死区
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 1000);
 | ||
|     pwm_db_falling_delay_set(ch, 1000);
 | ||
| 
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
|     pwm_cnt_start(ch, true);
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| //-----------------------------------------------------------------------------
 | ||
| 
 | ||
|     ch = PWM_CHANNEL_1;
 | ||
| //            j204      23  24
 | ||
|     pwm_gpio_config(ch, 58, 59);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM1 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[1]);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_NO_SHADOW, CC_NO_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     AQ_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMB_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);
 | ||
| 
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS );
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 1000);
 | ||
|     pwm_db_falling_delay_set(ch, 1000);
 | ||
| 
 | ||
| 
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
|     pwm_cnt_start(ch, true);
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
|     //-------------------------------------------------------------------------
 | ||
| 
 | ||
|     ch = PWM_CHANNEL_2;
 | ||
| //             j204    25   26
 | ||
|     pwm_gpio_config(ch, 60, 61);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM2 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[2]);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_NO_SHADOW, CC_NO_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     AQ_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     //选择延迟输入信号
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMB_RAW, DB_INMODE_PWMB_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);
 | ||
| 
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS );
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 100);
 | ||
|     pwm_db_falling_delay_set(ch, 200);
 | ||
| 
 | ||
| 
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
|     pwm_cnt_start(ch, true);
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
|     //-------------------------------------------------------------------------
 | ||
|     ch = PWM_CHANNEL_3;
 | ||
| //                 j207 8  7
 | ||
|     pwm_gpio_config(ch, 62, 63);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM3 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[3]);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_NO_SHADOW, CC_NO_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     AQ_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, counter_modes[ch]);
 | ||
| 
 | ||
|     //选择延迟输入信号
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMB_RAW, DB_INMODE_PWMB_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);
 | ||
| 
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS );
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 100);
 | ||
|     pwm_db_falling_delay_set(ch, 200);
 | ||
| 
 | ||
| 
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
|     pwm_cnt_start(ch, true);
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
| 
 | ||
|     //-------------------------------------------------------------------------
 | ||
| 
 | ||
|     pwm_cnt_soc_sync_load();
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
| 
 | ||
|     while (0) {
 | ||
|         delay_sometime(1000000);
 | ||
|         delay_sometime(1000000);
 | ||
|         delay_sometime(1000000);
 | ||
|         delay_sometime(1000000);
 | ||
|         delay_sometime(1000000);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| extern void iot_delay_us(uint32_t us);
 | ||
| #define DELAY_mS 1000
 | ||
| #define DELAY_S 1000* DELAY_mS
 | ||
| 
 | ||
| 
 | ||
| void delay_us(uint32_t us)
 | ||
| {
 | ||
|     gp_timer_set(0, 0xffffffff, 0);
 | ||
|     gp_timer_start(0);
 | ||
|     while (gp_timer_get_current_val(0) < us);
 | ||
|     gp_timer_stop(0);
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //单个通道同步加载
 | ||
| void pwm_prd_duty_inner_sync_load(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
|     uint32_t pwm_phase[4] = {1000, 2000, 3000, 4000};
 | ||
|     uint32_t pwm_duty[4][2]={{500,1000},
 | ||
|                              {500,1000},
 | ||
|                              {500,1000},
 | ||
|                              {500,1000},
 | ||
|     };
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
| //                 UART R1
 | ||
| //        pwm_synci_in_config(7);
 | ||
| //            j204      23  24
 | ||
|     pwm_gpio_config(ch, 58, 59);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[0]);
 | ||
|     pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMA_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B反相
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS ); //都不产生死区
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 100);
 | ||
|     pwm_db_falling_delay_set(ch, 100);
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
|     pwm_cnt_start(ch, true);
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_INNER_SYNC);
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
| 
 | ||
|     int pin = 8;
 | ||
|     hw_gpio_api_table.gpio_init();
 | ||
|     gpio_pin_select(pin, 0);
 | ||
|     hw_gpio_api_table.set_gpio_mode(pin, GPIO_OUTPUT);
 | ||
| 
 | ||
|     while (1) {
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 99); // 1M
 | ||
|         delay_sometime(80000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 50, 25);
 | ||
|         delay_sometime(80000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 0);
 | ||
|         delay_sometime(300000);
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 999); // 100k
 | ||
|         delay_sometime(30000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 500, 250);
 | ||
|         delay_sometime(30000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 1);
 | ||
|         delay_sometime(400000);
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 9999); // 10k
 | ||
|         delay_sometime(40000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 5000, 2500);
 | ||
|         delay_sometime(40000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 0);
 | ||
|         delay_sometime(500000);
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 99999); // 1k
 | ||
|         delay_sometime(50000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 50000, 25000);
 | ||
|         delay_sometime(50000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 1);
 | ||
|         delay_sometime(600000);
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 999999); // 100
 | ||
|         delay_sometime(60000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 500000, 250000);
 | ||
|         delay_sometime(60000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 0);
 | ||
|         delay_sometime(700000);
 | ||
| 
 | ||
|         pwm_tb_period_set(ch, 9999999); // 10
 | ||
|         delay_sometime(70000000);
 | ||
|         pwm_cmpa_cmpb_set(ch, 5000000, 2500000);
 | ||
|         delay_sometime(70000000);
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
|         hw_gpio_api_table.set_value(pin, 1);
 | ||
|         delay_sometime(800000);
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| uint32_t tz_cb(uint32_t mask)
 | ||
| {
 | ||
|     iot_printf("mask=%02x\r\n", mask);
 | ||
|     if (mask & PWM_OSHT_INT) {
 | ||
|         iot_printf("one shot\r\n");
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //单个通道同步加载
 | ||
| void pwm_chopping_test(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
| 
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
|     //                 UART R1
 | ||
|     //        pwm_synci_in_config(7);
 | ||
|     //                   j208      8   7
 | ||
|     pwm_gpio_config(PWM_CHANNEL_0, 58, 59);
 | ||
|     pwm_gpio_config(PWM_CHANNEL_1, 60, 61);
 | ||
|     for(ch = PWM_CHANNEL_0; ch <= PWM_CHANNEL_1; ch++) {
 | ||
|         pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|         pwm_tb_phase_set(ch, 0);
 | ||
|         pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|         //pwm waveform period
 | ||
|         pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|         //load from shadow select mode
 | ||
|         pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|         //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|         pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_cmpa_cmpb_set(ch, 5000, 2500);
 | ||
| 
 | ||
|         pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|         pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMA_RAW);
 | ||
|         pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B反相
 | ||
|         pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS ); //都不产生死区
 | ||
| 
 | ||
|         pwm_db_rising_delay_set(ch, 100);
 | ||
|         pwm_db_falling_delay_set(ch, 100);
 | ||
|         pwm_tb_cnt_set(ch, 0);
 | ||
|         pwm_cnt_start(ch, true);
 | ||
|         pwm_cnt_load_mode(ch, TB_LOAD_MODE_INNER_SYNC);
 | ||
| 
 | ||
|         pwm_cnt_inner_sync(ch);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
|     uint8_t all_chopp_duty_percent[]= {
 | ||
|         CHOPP_DUTY_PERCENT_12_5 ,
 | ||
|         CHOPP_DUTY_PERCENT_25_0 ,
 | ||
|         CHOPP_DUTY_PERCENT_37_0 ,
 | ||
|         CHOPP_DUTY_PERCENT_50_0 ,
 | ||
|         CHOPP_DUTY_PERCENT_62_5 ,
 | ||
|         CHOPP_DUTY_PERCENT_75_0 ,
 | ||
|         CHOPP_DUTY_PERCENT_87_5 };
 | ||
|     uint8_t all_chopp_freq_div[]={
 | ||
|         CHOPP_FREQ_DIV_1,
 | ||
|         CHOPP_FREQ_DIV_2,
 | ||
|         CHOPP_FREQ_DIV_3,
 | ||
|         CHOPP_FREQ_DIV_4,
 | ||
|         CHOPP_FREQ_DIV_5,
 | ||
|         CHOPP_FREQ_DIV_6,
 | ||
|         CHOPP_FREQ_DIV_7,
 | ||
|         CHOPP_FREQ_DIV_8
 | ||
|         };
 | ||
|     uint8_t all_chopp_one_shot_width[]={
 | ||
|         CHOPP_ONE_SHOT_WIDTH_0, // 1个分频后的周期
 | ||
|         CHOPP_ONE_SHOT_WIDTH_1, // 2个分频后的周期
 | ||
|         CHOPP_ONE_SHOT_WIDTH_2,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_3,
 | ||
| 
 | ||
|         CHOPP_ONE_SHOT_WIDTH_4,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_5,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_6,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_7,
 | ||
| 
 | ||
|         CHOPP_ONE_SHOT_WIDTH_8,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_9,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_10,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_11,
 | ||
| 
 | ||
|         CHOPP_ONE_SHOT_WIDTH_12,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_13,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_14,
 | ||
|         CHOPP_ONE_SHOT_WIDTH_15
 | ||
| 
 | ||
|         };
 | ||
|         #define TABLE_NUM(table) (sizeof(table)/sizeof(table[0]))
 | ||
|         int pin = 8;
 | ||
|         uint8_t v = 0;
 | ||
|         hw_gpio_api_table.gpio_init();
 | ||
|         gpio_pin_select(pin, 0);
 | ||
|         hw_gpio_api_table.set_gpio_mode(pin, GPIO_OUTPUT);
 | ||
| 
 | ||
|         for(int i = 0; i < TABLE_NUM(all_chopp_duty_percent); i++) {
 | ||
|             for(int j = 0; j < TABLE_NUM(all_chopp_freq_div); j++) {
 | ||
|                 for(int k = 0; k < TABLE_NUM(all_chopp_one_shot_width); k++) {
 | ||
|                    //chopp
 | ||
|                    // 仅pwm0使用chopping,以作对比
 | ||
| 
 | ||
|                     pwm_chopping_duty_sel(PWM_CHANNEL_0, all_chopp_duty_percent[i]);
 | ||
|                     pwm_chopping_div_sel(PWM_CHANNEL_0, all_chopp_freq_div[j]);
 | ||
|                     pwm_chopping_one_shot_width_sel(PWM_CHANNEL_0, all_chopp_one_shot_width[k]);
 | ||
|                     pwm_chopping_en(PWM_CHANNEL_0, true);
 | ||
| 
 | ||
|                     delay_sometime(80000);
 | ||
|                     hw_gpio_api_table.set_value(pin, v);
 | ||
|                     v ^= 0x01;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
| 
 | ||
|         while(1) {
 | ||
| 
 | ||
|         }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| //
 | ||
| void pwm_tz_with_intr_test(void)
 | ||
| {
 | ||
|         uint8_t ch = PWM_CHANNEL_0;
 | ||
|         uint32_t pwm_phase[4] = {1000, 2000, 3000, 4000};
 | ||
|         uint32_t pwm_duty[4][2]={{500,1000},
 | ||
|                                  {500,1000},
 | ||
|                                  {500,1000},
 | ||
|                                  {500,1000},
 | ||
|         };
 | ||
| 
 | ||
| 
 | ||
|         pwm_tbclk_sync(ch, false);
 | ||
|     //                 UART R1
 | ||
| //        pwm_synci_in_config(7);
 | ||
|         pwm_tz_pin_set(ch, 7);
 | ||
|         pwm_tz_sel(ch, TZ_SEL_TZ1_CBC);
 | ||
|         pwm_tz_acta_set(ch, TZ_ACTION_FORCE_HIGHT);
 | ||
|         pwm_tz_actb_set(ch, TZ_ACTION_FORCE_LOW);
 | ||
|     //
 | ||
|         pwm_gpio_config(ch, 58, 59);
 | ||
|         //pwm_interrupt_init(ch, PWM_OSHT_INT, tz_cb);
 | ||
| 
 | ||
|         pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|         pwm_tb_phase_set(ch, pwm_phase[0]);
 | ||
|         pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|         //pwm waveform period
 | ||
|         pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|         //load from shadow select mode
 | ||
|         pwm_cmpctl_set(ch, CC_CTR_ZERO, CC_CTR_ZERO, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|         //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|         pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|             AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|         pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|         pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|         pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMA_RAW);
 | ||
|         pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B反相
 | ||
|         pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS ); //都不产生死区
 | ||
| 
 | ||
|         pwm_db_rising_delay_set(ch, 100);
 | ||
|         pwm_db_falling_delay_set(ch, 100);
 | ||
|         pwm_tb_cnt_set(ch, 0);
 | ||
|         pwm_cnt_start(ch, true);
 | ||
|         pwm_cnt_load_mode(ch, TB_LOAD_MODE_INNER_SYNC);
 | ||
| 
 | ||
|         pwm_cnt_inner_sync(ch);//    pwm_cnt_soc_sync_load();
 | ||
| 
 | ||
|         pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
|         //int duty_a = 250;
 | ||
|         //int duty_b = 500;
 | ||
|         //int prd    = 5000;
 | ||
| 
 | ||
|         int pin = 8;
 | ||
|         hw_gpio_api_table.gpio_init();
 | ||
|         gpio_pin_select(pin, 0);
 | ||
|         hw_gpio_api_table.set_gpio_mode(pin, GPIO_OUTPUT);
 | ||
| 
 | ||
|     while (1) {
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| //
 | ||
| void pwm_auto_modify_duty(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
|     uint32_t pwm_phase[4] = {1000, 2000, 3000, 4000};
 | ||
|     uint32_t pwm_duty[4][2]={{0,0},
 | ||
|                              {500,1000},
 | ||
|                              {500,1000},
 | ||
|                              {500,1000},
 | ||
|     };
 | ||
| 
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
|     //                 UART R1
 | ||
|     //        pwm_synci_in_config(7);
 | ||
|     //
 | ||
|     pwm_gpio_config(ch, 58, 59);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, pwm_phase[0]);
 | ||
|     pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_PWM,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, pwm_duty[ch][0], pwm_duty[ch][1]);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     pwm_db_inmode_set(ch, DB_INMODE_PWMA_RAW, DB_INMODE_PWMA_RAW);
 | ||
|     pwm_db_polsel_set(ch, DB_POLSE_NORMAL, DB_POLSE_NORMAL);    //A不反相,B反相
 | ||
|     pwm_db_outmode_set(ch, DB_OUTMODE_BYPASS, DB_OUTMODE_BYPASS ); //都不产生死区
 | ||
| 
 | ||
|     pwm_db_rising_delay_set(ch, 100);
 | ||
|     pwm_db_falling_delay_set(ch, 100);
 | ||
|     pwm_tb_cnt_set(ch, 0);
 | ||
| 
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_INNER_SYNC);
 | ||
| 
 | ||
|     pwm_cmpctl_cmpa_end(ch,    10000);
 | ||
|     pwm_cmpctl_cmpa_step( ch,  200);
 | ||
|     pwm_cmpctl_cmpb_end( ch,   10000);
 | ||
|     pwm_cmpctl_cmpb_step( ch,  100);
 | ||
|     pwm_cmpctl_auto_duty( ch, true, true);
 | ||
|     pwm_cnt_inner_sync(ch);//    pwm_cnt_soc_sync_load();
 | ||
| 
 | ||
|     pwm_cnt_start(ch, true);
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| extern void _start(void);
 | ||
| extern struct uart_ctrl uart_e_ctrl;
 | ||
| #define my_g_uart_ctrl uart_e_ctrl
 | ||
| #include "uart_e.h"
 | ||
| #include "uart.h"
 | ||
| #include "apb.h"
 | ||
| 
 | ||
| //#define __noinit__ __attribute__ ((section (".noinit"))) //变量不初始化
 | ||
| 
 | ||
| //__noinit__ unsigned int SystemRamTest;//RAM不初始化
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| uint32_t *p_data = (uint32_t *)0x10038004;
 | ||
| 
 | ||
| void wdt_cpu_reset_pwm_test(void)
 | ||
| {
 | ||
| 
 | ||
|     uint32_t cur_cpu = cpu_get_mhartid();
 | ||
| 
 | ||
|     ahb_core0_set_start((uint32_t) _start);
 | ||
| 
 | ||
|     wdg_deinit(cur_cpu);
 | ||
|     wdg_init(cur_cpu);
 | ||
| 
 | ||
|     wdg_set_cmp(cur_cpu, 999);//SET_WDG_INTC_CMP);
 | ||
|     wdg_set_timeout_cmp(cur_cpu, 50);//SET_WDG_TIMEOUT_CMP);
 | ||
|     wdg_set_cpurst_cmp(cur_cpu, 31);//SET_WDG_CPURST_CMP );
 | ||
|     wdg_set_fullrst_cmp(cur_cpu, 60);//SET_WDG_FULLRST_CMP);
 | ||
| 
 | ||
| #if 1
 | ||
| 
 | ||
|     if (0xabcdaabb == (*p_data)) {
 | ||
|         iot_printf("wdg cpu rst\r\n");
 | ||
|     } else {
 | ||
|         iot_printf("pow on rst\r\n");
 | ||
|         (*p_data) = 0xabcdaabb;
 | ||
|         pwm_auto_modify_duty();
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
| #else
 | ||
|     uint32_t flag = 0;
 | ||
| 
 | ||
|     flag = ahb_scratch_reg_get(1);
 | ||
|     if (0xabcdaabb == flag) {
 | ||
|         iot_printf("wdg rst flag=0x%08x\r\n", flag);
 | ||
|     } else {
 | ||
|         iot_printf("pow on rst flag=0x%08x\r\n", flag);
 | ||
|         counter_modes_test();
 | ||
|         ahb_scratch_reg_set(1, 0xabcdaabb);
 | ||
| 
 | ||
|     }
 | ||
| #endif
 | ||
| 
 | ||
|     while(1){
 | ||
|     //my_g_uart_ctrl.puts(port, (uint8_t*)"***\r\n", 5);
 | ||
|         //iot_printf("^v^");
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void wdt_full_reset_pwm_test(void)
 | ||
| {
 | ||
| 
 | ||
|     uint32_t cur_cpu = cpu_get_mhartid();
 | ||
| 
 | ||
|     ahb_core0_set_start((uint32_t) _start);
 | ||
| 
 | ||
|     wdg_deinit(cur_cpu);
 | ||
|     wdg_init(cur_cpu);
 | ||
| 
 | ||
|     wdg_set_cmp(cur_cpu, 999);//SET_WDG_INTC_CMP);
 | ||
|     wdg_set_timeout_cmp(cur_cpu, 50);//SET_WDG_TIMEOUT_CMP);
 | ||
|     wdg_set_cpurst_cmp(cur_cpu, 60);//SET_WDG_CPURST_CMP );
 | ||
|     wdg_set_fullrst_cmp(cur_cpu, 31);//SET_WDG_FULLRST_CMP);
 | ||
| 
 | ||
|     if (0xabcdaabb == (*p_data)) {
 | ||
|         iot_printf("wdg full rst\r\n");
 | ||
|     } else {
 | ||
|         iot_printf("pow on rst\r\n");
 | ||
|         (*p_data) = 0xabcdaabb;
 | ||
|         pwm_auto_modify_duty();
 | ||
| 
 | ||
|     }
 | ||
|     while(1){
 | ||
|     //my_g_uart_ctrl.puts(port, (uint8_t*)"***\r\n", 5);
 | ||
|         //iot_printf("^v^");
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| void soft_reset_pwm_test(void)
 | ||
| {
 | ||
| 
 | ||
|     ahb_core0_set_start((uint32_t) _start);
 | ||
| 
 | ||
|     gp_timer_init();
 | ||
|     gp_timer_set(0, 0xffffffff, 0);
 | ||
|     gp_timer_start(0);
 | ||
| 
 | ||
|     pwm_auto_modify_duty();
 | ||
|     iot_delay_us(500000);
 | ||
|     iot_printf("soft_rst\r\n");
 | ||
|     iot_delay_us(500000);
 | ||
|     //sec_glb_chip_rst();
 | ||
| 
 | ||
|     while(1){
 | ||
|     //my_g_uart_ctrl.puts(port, (uint8_t*)"***\r\n", 5);
 | ||
|         //iot_printf("^v^");
 | ||
|     }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| int g_duty_a = 100;
 | ||
| int g_duty_b = 200;
 | ||
| uint8_t g_ch = PWM_CHANNEL_3;
 | ||
| //每个周期都改变占空比
 | ||
| uint32_t interrupt_cb(void)
 | ||
| {
 | ||
|     g_duty_a += 100;
 | ||
|     if (g_duty_a > 10000) {
 | ||
|         g_duty_a = 100;
 | ||
|     }
 | ||
| 
 | ||
|     g_duty_b += 100;
 | ||
|     if (g_duty_b > 10000) {
 | ||
|         g_duty_b = 200;
 | ||
|     }
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(g_ch, g_duty_a, g_duty_b);
 | ||
| 
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| // 中断测试
 | ||
| void pwm_main4(void)
 | ||
| {
 | ||
|     uint32_t cpu_id = cpu_get_mhartid();
 | ||
| 
 | ||
|     iot_interrupt_init(cpu_id);
 | ||
| 
 | ||
|     pwm_tbclk_sync(g_ch, false);
 | ||
| 
 | ||
|     //                           8   7
 | ||
|     pwm_gpio_config_with_isr(g_ch, 26, 27, interrupt_cb);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(g_ch, true); // 使能PWM 的时钟
 | ||
|     pwm_tb_phase_set(g_ch, 0);
 | ||
|     pwm_tbctl_set(g_ch, TB_DISABLE, TB_SHADOW, TB_SYNC_CNT_ZERO,99);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(g_ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     //注意:若A或B 的ld mode被配置为 CC_CTR_FREEZE 则B的占空比保持着不再变化,
 | ||
|     //却决于原来的状态,若是上电第一次运行,则B保持全低或者全高
 | ||
|     pwm_cmpctl_set(g_ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
|     pwm_aqctlb_set(g_ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(g_ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(g_ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     pwm_interrupt_init(g_ch);
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(g_ch, g_duty_a, g_duty_b);
 | ||
| 
 | ||
|     pwm_tbclk_sync(g_ch, true);
 | ||
| 
 | ||
|     while (1);
 | ||
| }
 | ||
| 
 | ||
| extern void pwm_fault_config(uint8_t ch, uint8_t gpio, uint8_t h_state,
 | ||
|                        uint8_t l_state,pwm_isr cb);
 | ||
| int v = 0;
 | ||
| int pin = 8; //t1
 | ||
| 
 | ||
| uint32_t pwm_falut_cb(void)
 | ||
| {
 | ||
|     hw_gpio_api_table.set_value(pin, v);
 | ||
|     v ^= 0x01;
 | ||
| 
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //输出 h 和 l输出互补的pwm 波形
 | ||
| void pwm_main5(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
|     uint32_t pwm_clk;
 | ||
| 
 | ||
|     iot_printf("%s\r\n", __func__);
 | ||
| 
 | ||
|     iot_pwm_gpio_config(ch, 58, 59);
 | ||
| 
 | ||
|     iot_pwm_hw_init(ch);
 | ||
|     iot_pwm_start(ch);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     hw_gpio_api_table.gpio_init();
 | ||
|     gpio_pin_select(pin, 0);
 | ||
|     hw_gpio_api_table.set_gpio_mode(pin, GPIO_OUTPUT);
 | ||
| 
 | ||
| 
 | ||
|     pwm_clk = pwm_get_ch_clk(ch);
 | ||
|     iot_printf("clk_freq=%d\r\n", pwm_clk);
 | ||
|     iot_pwm_set_period(ch, 1000000); // 10k
 | ||
| 
 | ||
|     iot_pwm_set_duty(ch, 50000);
 | ||
|     pwm_fault_config(ch, 60, 0, 0, pwm_falut_cb);
 | ||
| 
 | ||
|     int duty  = 0;
 | ||
| 
 | ||
|     while (1) {
 | ||
| 
 | ||
|         //hw_gpio_api_table.set_value(pin, v);
 | ||
|         //v ^= 0x01;
 | ||
|         delay_sometime(500000);
 | ||
|         //iot_pwm_set_duty(ch, duty);
 | ||
|         duty += 100;
 | ||
|         if (duty > 10000) duty = 0;
 | ||
| 
 | ||
|     }
 | ||
| }
 | ||
| //------------------------------------------------------------------------------
 | ||
| void pwm_src_clk_freq_test(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
| 
 | ||
|     dcase_start("src_clk_freq_test\n");
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
| 
 | ||
|     //                  t1  t2
 | ||
|     pwm_gpio_config(ch, 8, 36);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, 0);
 | ||
|     pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_CNT_ZERO, 49);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     //注意这里必须都设为CC_CTR_PRD,如果为CC_CTR_ZERO 输出的波形不对,
 | ||
|     //在B的占空比为0时,A会少一个脉冲
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     // 独立输出PWM 0-100都可以,给duty_a和duty_b初值分别赋:
 | ||
|     // 0    0       A B输出相同占空比的PWM波形
 | ||
|     // 0    100     A 为0时B不为0
 | ||
|     // 100  0       B 为0时A不为0
 | ||
|     //
 | ||
|     int duty_a = 5000;
 | ||
|     int duty_b = 2500;
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, duty_a, duty_b);
 | ||
| 
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| //
 | ||
| 
 | ||
| pwm_cnt_start(ch, true);
 | ||
| pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
| 
 | ||
| //pwm_cnt_soc_sync_load();
 | ||
| pwm_cnt_soc_sync_load();//pwm_cnt_inner_sync( ch);
 | ||
| 
 | ||
| //
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
| 
 | ||
|     dcase_success();
 | ||
| }
 | ||
| void pwm_max_freq_test(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
| 
 | ||
|     dcase_start("pwm_max_freq_test\n");
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
| 
 | ||
|     //                  8   7
 | ||
|     pwm_gpio_config(ch, 26, 27);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, 0);
 | ||
|     pwm_tbctl_set(ch, TB_DISABLE, TB_SHADOW, TB_SYNC_CNT_ZERO, 0);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 1);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     //注意这里必须都设为CC_CTR_PRD,如果为CC_CTR_ZERO 输出的波形不对,
 | ||
|     //在B的占空比为0时,A会少一个脉冲
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     // 独立输出PWM 0-100都可以,给duty_a和duty_b初值分别赋:
 | ||
|     // 0    0       A B输出相同占空比的PWM波形
 | ||
|     // 0    100     A 为0时B不为0
 | ||
|     // 100  0       B 为0时A不为0
 | ||
|     //
 | ||
|     int duty_a = 0;
 | ||
|     int duty_b = 0;
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, duty_a, duty_b);
 | ||
| 
 | ||
|     pwm_aqctlb_set(ch, AQ_NOTHING, AQ_TOGGLE,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_NOTHING, AQ_TOGGLE,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
| 
 | ||
|     dcase_success();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //-------------------------
 | ||
| void pwm_sync_in_test(void)
 | ||
| {
 | ||
|     uint8_t ch = PWM_CHANNEL_0;
 | ||
| 
 | ||
|     dcase_start("pwm_sync_in_test\n");
 | ||
| 
 | ||
|     pwm_tbclk_sync(ch, false);
 | ||
| 
 | ||
|     //                  8   7
 | ||
|     pwm_gpio_config(ch, 26, 27);
 | ||
|     //                  10
 | ||
|     pwm_synci_in_config(28);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, true); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, 0);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_PWM, 0);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     //注意这里必须都设为CC_CTR_PRD,如果为CC_CTR_ZERO 输出的波形不对,
 | ||
|     //在B的占空比为0时,A会少一个脉冲
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     // 独立输出PWM 0-100都可以,给duty_a和duty_b初值分别赋:
 | ||
|     // 0    0       A B输出相同占空比的PWM波形
 | ||
|     // 0    100     A 为0时B不为0
 | ||
|     // 100  0       B 为0时A不为0
 | ||
|     //
 | ||
|     int duty_a = 5000;
 | ||
|     int duty_b = 2500;
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, duty_a, duty_b);
 | ||
| 
 | ||
| //下面是PWM1的配置
 | ||
|     ch = PWM_CHANNEL_1;
 | ||
|     //             j204 19 38
 | ||
|     pwm_gpio_config(ch, 9, 12);
 | ||
| 
 | ||
|     pwm_tbclk_ctrl(ch, false); // 使能PWM0 的时钟
 | ||
|     pwm_tb_phase_set(ch, 0);
 | ||
|     pwm_tbctl_set(ch, TB_ENABLE, TB_SHADOW, TB_SYNC_CNT_ZERO, 0);
 | ||
| 
 | ||
|     //pwm waveform period
 | ||
|     pwm_tb_period_set(ch, 9999);
 | ||
| 
 | ||
|     //load from shadow select mode
 | ||
|     //注意这里必须都设为CC_CTR_PRD,如果为CC_CTR_ZERO 输出的波形不对,
 | ||
|     //在B的占空比为0时,A会少一个脉冲
 | ||
|     pwm_cmpctl_set(ch, CC_CTR_PRD, CC_CTR_PRD, CC_SHADOW, CC_SHADOW);
 | ||
| 
 | ||
|     //action when counter equals zero or CMPA register
 | ||
|     pwm_aqctlb_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_NOTHING, AQ_NOTHING, AQ_CLEAR, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_aqctla_set(ch, AQ_SET, AQ_NOTHING,
 | ||
|         AQ_CLEAR, AQ_NOTHING, AQ_NOTHING, AQ_NOTHING);
 | ||
| 
 | ||
|     pwm_cnt_mode_set(ch, TB_COUNT_UP);
 | ||
| 
 | ||
|     // 独立输出PWM 0-100都可以,给duty_a和duty_b初值分别赋:
 | ||
|     // 0    0       A B输出相同占空比的PWM波形
 | ||
|     // 0    100     A 为0时B不为0
 | ||
|     // 100  0       B 为0时A不为0
 | ||
|     //
 | ||
| 
 | ||
|     pwm_cmpa_cmpb_set(ch, duty_a, duty_b);
 | ||
| 
 | ||
|     pwm_cnt_start(0, true);
 | ||
|     pwm_cnt_start(1, true);
 | ||
| 
 | ||
|     pwm_cnt_load_mode(ch, TB_LOAD_MODE_SOC_SYNC);
 | ||
|     //pwm_cnt_soc_sync_load();
 | ||
|     pwm_tbclk_sync(ch, true);
 | ||
| 
 | ||
| 
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
|     delay_sometime(10000);
 | ||
| 
 | ||
|     dcase_success();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| #ifdef __GNUC__
 | ||
| 
 | ||
| 
 | ||
| int main(void)
 | ||
| {
 | ||
|     dbg_uart_init();
 | ||
| 
 | ||
|     pwm_main5();
 | ||
|     void (*test_case_table[])(void) = {
 | ||
|         all_pwm_module_sync_test_with_intc,  // 0
 | ||
|         counter_modes_test,                  // 1
 | ||
|         pwm_prd_duty_inner_sync_load,        // 2
 | ||
|         pwm_chopping_test,                   // 3
 | ||
|         pwm_auto_modify_duty,                // 4
 | ||
|         pwm_tz_with_intr_test,               // 5
 | ||
|         wdt_full_reset_pwm_test,             // 6   注意测试6,7,8时需要屏蔽startup_init.c void pre_init()函数中的 wdg_deinit(cpu);
 | ||
|         wdt_cpu_reset_pwm_test,              // 7
 | ||
|         soft_reset_pwm_test,                 // 8
 | ||
|         pwm_main5                            // 9
 | ||
|     };
 | ||
|     //dversion();
 | ||
|     dstart();
 | ||
|     //dend();
 | ||
|     while(1) {
 | ||
|         if (uart_e_ctrl.rx_fifo_cnt(UART_PT0) > 0) {
 | ||
|             int c = uart_e_ctrl.getc(UART_PT0);
 | ||
|             if ( (c >= 0) && (c < sizeof(test_case_table)/sizeof(test_case_table[0]))) {
 | ||
|                 iot_printf("test case %d\r\n", c);
 | ||
|                 test_case_table[c]();
 | ||
|             } else {
 | ||
| 
 | ||
|                 iot_printf("test case invalid\r\n", c);
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|     }
 | ||
|     return 0;
 | ||
| }
 | ||
| 
 | ||
| #endif // __GCC__
 | ||
| 
 |