KING_阿飞

  • 2022-08-03
  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】WDT 看门狗分析及应用

    【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】WDT 看门狗分析及应用 很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 如果因为网络问题无法进入Github可以在Gitee中下载,可能会存在没有及时更新。Gitee:My_AT32WB415_Demo: 雅特力科技AT32WB415系列学习,从各个外设入手,学习各个功能。 (gitee.com) 一、看门狗     看门狗由一个12位的递减计数器和一个8位的预分频器所组成,它由低速内部LICK提供时钟;因为这个时钟独立于主时钟,所以它可运行于深睡眠和待机模式。它可以被当成看门狗用于在发生错误时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过用户系统数据可以配置看门狗是否自启动。在调试模式下,计数器可以被冻结。       我们关注一下命令寄存器和重装载寄存器。         我们再看一下,喂狗超时时间计算,先看一张表: 再看计算公式: 二、代码分析       void wdt_init(void) { if(crm_flag_get(CRM_WDT_RESET_FLAG) != RESET) { /* reset from wdt */ crm_flag_clear(CRM_WDT_RESET_FLAG); } /* disable register write protection */ wdt_register_write_enable(TRUE); /* set the wdt divider value */ wdt_divider_set(WDT_CLK_DIV_4); /* set reload value timeout = reload_value * (divider / lick_freq ) (s) lick_freq = 40000 Hz divider = 4 reload_value = 3000 timeout = 3000 * (4 / 40000 ) = 0.3s = 300ms */ wdt_reload_value_set(3000 - 1); /* enable wdt */ wdt_enable(); }      以及重新装载值API: /* reload wdt counter */ wdt_counter_reload(); 三、效果展示     这部分没什么好展示的,大家感兴趣的可以去仓库看完整代码。

  • 回复了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】ATLINK驱动无法安装

    WIN10是免驱,其它确实要安装

  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】PWM 呼吸灯

    【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】PWM 呼吸灯 很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 如果因为网络问题无法进入Github可以在Gitee中下载,可能会存在没有及时更新。Gitee:My_AT32WB415_Demo: 雅特力科技AT32WB415系列学习,从各个外设入手,学习各个功能。 (gitee.com) 一、PWM分析          查看一下灯PB9的引脚,判断是否有PWM产生。     我们再来分析一下AT32的PWM的配置,我们可以看到,Tme4是通用定时器,产生PWM。      控制PWM输出的是有Cxdt来的,我们再库函数中也能看到。       具体的pwm的原理就不多说,大家感兴趣的可以参考STM32的教程:(13条消息) STM32控制舵机讲解,从入门到放弃。_KING_阿飞的博客-CSDN博客_stm32控制舵机的例程详细解释 二、代码配置       我们首先看结构体里面, /** * @brief tmr output config type */ typedef struct { tmr_output_control_mode_type oc_mode; /*!< output channel mode */ confirm_state oc_idle_state; /*!< output channel idle state */ confirm_state occ_idle_state; /*!< output channel complementary idle state */ tmr_output_polarity_type oc_polarity; /*!< output channel polarity */ tmr_output_polarity_type occ_polarity; /*!< output channel complementary polarity */ confirm_state oc_output_state; /*!< output channel enable */ confirm_state occ_output_state; /*!< output channel complementary enable */ } tmr_output_config_type;       oc_mode 配置模式     oc_idle_state;        输出通道的空闲状态     occ_idle_state;      输出互补通道空闲状态     oc_polarity;            输出通道极性     occ_polarity;          输出互补通道极性     oc_output_state;    输出通过使能      occ_output_state  输出互补通道使能   具体配置: gpio_init_type gpio_init_struct; tmr_output_config_type tmr_oc_init_structure; uint16_t div_value = 0; /* tmr4 clock enable */ crm_periph_clock_enable(CRM_TMR4_PERIPH_CLOCK, TRUE); /* gpioa gpiob clock enable */ crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); gpio_default_para_init(&gpio_init_struct); gpio_init_struct.gpio_pins = GPIO_PINS_9; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(GPIOB, &gpio_init_struct); /* compute the div value */ div_value = (uint16_t)(system_core_clock / 24000000) - 1; /* tmr4 time base configuration */ tmr_base_init(TMR4, 665, div_value); tmr_cnt_dir_set(TMR4, TMR_COUNT_UP); tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1); tmr_output_default_para_init(&tmr_oc_init_structure); tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A; tmr_oc_init_structure.oc_idle_state = FALSE; tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH; tmr_oc_init_structure.oc_output_state = TRUE; tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_4, &tmr_oc_init_structure); tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_4, 83); tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_4, TRUE); tmr_period_buffer_enable(TMR4, TRUE); /* tmr enable counter */ tmr_counter_enable(TMR4, TRUE); uint16_t period, pulse, dir; period = 665; dir = 1; pulse = 0; while(1){ vTaskDelay(50); if (dir) { pulse += 30; } else { pulse -= 30; } if (pulse >= period) { dir = 0; } if (0 == pulse) { dir = 1; } tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_4, pulse); }   三、效果展示 [localvideo]549c921acc64ddbd821e0225e397de72[/localvideo]  

  • 回复了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】移植MCU控制蓝牙,蓝牙固件烧录

    秦天qintian0303 发表于 2022-8-3 09:38 出厂蓝牙固件应该都带的吧
    应该是,板子拿到手我就给全部擦除了,带没带我就不清楚。

  • 2022-08-02
  • 回复了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】在FreeRTOS中ADC采集温度传感器

    Jacktang 发表于 2022-8-2 07:23 测试的效果还是挺好的 串口打印时board文件中,已经写好的PA2的串口输出功能直接使用,确实省事多了
    板载的AT-LINK已经连接到了,一个接口就够了,看得出雅特力的技术人员对生态的看重,基本的例程和外设都由,工具,软件都比较齐全

  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】USB CDC 串口Printf打印调试信息

    本帖最后由 KING_阿飞 于 2022-8-3 11:49 编辑 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】USB CDC 串口Printf打印调试信息   很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 如果因为网络问题无法进入Github可以在Gitee中下载,可能会存在没有及时更新。Gitee:My_AT32WB415_Demo: 雅特力科技AT32WB415系列学习,从各个外设入手,学习各个功能。 (gitee.com) 一、USB协议移植     关于USB的协议大家可以去USB的官网:Front Page | USB-IF     我们主要是完成USB CDC 虚拟串口的移植,主要有以下几个文件:     库文件在官网的资料包中就有,没有找到可以去我仓库复制;官网做了一个适配这个MCU的配置文件,usb_conf.h /** ************************************************************************** * @File usb_conf.h * @version v2.0.2 * @date 2022-06-28 * @brief usb config header file ************************************************************************** * Copyright notice & Disclaimer * * The software Board Support Package (BSP) that is made available to * download from Artery official website is the copyrighted work of Artery. * Artery authorizes customers to use, copy, and distribute the BSP * software and its related documentation for the purpose of design and * development in conjunction with Artery microcontrollers. Use of the * software is governed by this copyright notice and the following disclaimer. * * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. * ************************************************************************** */ /* define to prevent recursive inclusion -------------------------------------*/ #ifndef __USB_CONF_H #define __USB_CONF_H #ifdef __cplusplus extern "C" { #endif #include "at32wb415_usb.h" #include "at32wb415.h" #include "stdio.h" /** @addtogroup AT32WB415_periph_examples * @{ */ /** @addtogroup 415_USB_device_vcp_loopback * @{ */ /** * @brief enable usb device mode */ #define USE_OTG_DEVICE_MODE /** * @brief enable usb host mode */ /* #define USE_OTG_HOST_MODE */ #define USB_ID 0 #define OTG_CLOCK CRM_OTGFS1_PERIPH_CLOCK #define OTG_IRQ OTGFS1_IRQn #define OTG_IRQ_HANDLER OTGFS1_IRQHandler #define OTG_WKUP_IRQ OTGFS1_WKUP_IRQn #define OTG_WKUP_HANDLER OTGFS1_WKUP_IRQHandler #define OTG_WKUP_EXINT_LINE EXINT_LINE_18 #define OTG_PIN_GPIO GPIOA #define OTG_PIN_GPIO_CLOCK CRM_GPIOA_PERIPH_CLOCK #define OTG_PIN_SOF_GPIO GPIOA #define OTG_PIN_SOF_GPIO_CLOCK CRM_GPIOA_PERIPH_CLOCK #define OTG_PIN_SOF GPIO_PINS_8 /** * @brief usb device mode config */ #ifdef USE_OTG_DEVICE_MODE /** * @brief usb device mode fifo */ /* otg1 device fifo */ #define USBD_RX_SIZE 128 #define USBD_EP0_TX_SIZE 24 #define USBD_EP1_TX_SIZE 20 #define USBD_EP2_TX_SIZE 20 #define USBD_EP3_TX_SIZE 20 /** * @brief usb endpoint max num define */ #ifndef USB_EPT_MAX_NUM #define USB_EPT_MAX_NUM 4 #endif #endif /** * @brief usb host mode config */ #ifdef USE_OTG_HOST_MODE #ifndef USB_HOST_CHANNEL_NUM #define USB_HOST_CHANNEL_NUM 8 #endif /** * @brief usb host mode fifo */ /* otg1 host fifo */ #define USBH_RX_FIFO_SIZE 128 #define USBH_NP_TX_FIFO_SIZE 96 #define USBH_P_TX_FIFO_SIZE 96 #endif /** * @brief usb sof output enable */ /* #define USB_SOF_OUTPUT_ENABLE */ #define USB_VBUS_IGNORE /** * @brief usb low power wakeup handler enable */ /* #define USB_LOW_POWER_WAKUP */ void usb_delay_ms(uint32_t ms); void usb_delay_us(uint32_t us); /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif 二、移植过程中的问题     在移植过程中,我代码卡在了B处,这里一看就是没有中断处理函数,应该是OTGFS1_IRQHandler这个没有,我们经过查找,官方将其宏定义了,我们要重新给他写一下。   /** * @brief this function handles otgfs interrupt. * @param none * @retval none */ void OTG_IRQ_HANDLER(void) { usbd_irq_handler(&otg_core_struct); }  然后根据上篇文章的经验,我们还需要再写一个延时函数 void usb_delay_ms(uint32_t ms){ vTaskDelay(ms); } 编写USB CDC 的Printf //printf redefine void usb_printf(const char *fmt,...) { static va_list ap; uint16_t len = 0; va_start(ap, fmt); len = vsprintf((char *)usb_buf, fmt, ap); va_end(ap); /* send data to host */ if(usb_vcp_send_data(&otg_core_struct.dev, usb_buf, len) == SUCCESS) { return; } }   /** * @brief usb 48M clock select * @param clk_s:USB_CLK_HICK, USB_CLK_HEXT * @retval none */ void usb_clock48m_select(usb_clk48_s clk_s) { switch(system_core_clock) { /* 48MHz */ case 48000000: crm_usb_clock_div_set(CRM_USB_DIV_1); break; /* 72MHz */ case 72000000: crm_usb_clock_div_set(CRM_USB_DIV_1_5); break; /* 96MHz */ case 96000000: crm_usb_clock_div_set(CRM_USB_DIV_2); break; /* 120MHz */ case 120000000: crm_usb_clock_div_set(CRM_USB_DIV_2_5); break; /* 144MHz */ case 144000000: crm_usb_clock_div_set(CRM_USB_DIV_3); break; default: break; } } 有这个USB串口调试也挺方便的,现在是有一个板载的AT-LINK暂时还看不到它的价值,之后如果实际使用的话,它的价值就大了。 三、效果展示  

  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】移植MCU控制蓝牙,蓝牙固件烧录

    本帖最后由 KING_阿飞 于 2022-8-2 15:40 编辑 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】移植MCU控制蓝牙,蓝牙固件烧录 很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 如果因为网络问题无法进入Github可以在Gitee中下载,可能会存在没有及时更新。Gitee:My_AT32WB415_Demo: 雅特力科技AT32WB415系列学习,从各个外设入手,学习各个功能。 (gitee.com) 一、蓝牙固件代码烧录      雅特力AT32WB415是合体芯片,一个MCU加一个蓝牙,中间连接了一个串口,带2个UART, 其中UART21与MCU USART3连接。我们可以通过ArteryICPProgrammer这个软件烧入固件代码。这里我用到的版本是V3.0.03,第一次下载请给AT-Link固件升级一下,这个软件就可以升级。     页面中 第一个固件就是蓝牙的,另一个就是我们MCU的固件。     官方的蓝牙固件包在其页面下就可以找到雅特力科技 : 32位微控制器的创新领导者! (arterytek.com)     该工程是ARM9的工程,需要安装Legacy Support才能够编译, 用户可根据自己的环境在以下     路径进行下载: www2.keil.com/mdk5/legacy,这里我把我编译的bin文件放在仓库中,大家需要的可以自取。     在官方文件中的指南里面就讲的比较清楚,我在这里不过多赘述。讲几个需要注意的点:蓝牙的地址是0x000000的、在复位是应该有一个时序的问题,需要先复位MCU在复位蓝牙、我们手机的蓝牙必须使用类似LightBlue这类的软件才可以连接,直接是无法连接上,这部分我也没有涉及过,属于知识盲区了。希望有人可以在这方面研究一下。 二、MCU代码的移植     其实在,官方里面的文档也写了,我们没必要继续重复造轮子了(其实就是懒😁)     具体的移植步骤就不多说,也比较简单,有问题可以在评论区提出。这里讲一些我在移植过程中的问题,这样的效果更好。     FreeRTOS卡死:在Debug发现会一直等待,研究发现是官方的at32_button_press这个按键检测的函数里面的延时是delay_ms,这里我改成FreeRTOS里面的延时。       所有的代码我也不在这里放出来了,全部在Github上有,而且能够看到每次的变化,也知道我添加了哪些文件。 这里放一些必须要弄的: #include "bsp_usart.h" void usart3_init(uint32_t baudrate) { gpio_init_type gpio_init_struct; crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE); gpio_pin_remap_config(USART3_GMUX_0010, TRUE); gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_pins = GPIO_PINS_7; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init(GPIOA, &gpio_init_struct); gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_mode = GPIO_MODE_INPUT; gpio_init_struct.gpio_pins = GPIO_PINS_6; gpio_init_struct.gpio_pull = GPIO_PULL_UP; gpio_init(GPIOA, &gpio_init_struct); nvic_irq_enable(USART3_IRQn, 0, 0); /* configure uart param */ usart_init(USART3, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT); usart_transmitter_enable(USART3, TRUE); usart_receiver_enable(USART3, TRUE); /* Enable the USARTx Interrupt */ usart_interrupt_enable(USART3, USART_RDBF_INT, TRUE); usart_enable(USART3, TRUE); }        #include "at_task.h" #include "at32wb415_board.h" #include "at_cmd.h" #include "tp_mode.h" #include "stdio.h" #include "string.h" #include "FreeRTOS.h" #include "task.h" //#define BT_FLASH_WR_TEST #define SIZEOFMSG (sizeof(at_cmd_list)/sizeof(struct at_cmd_msg)) extern cmd_flash_read_status fr_flag; extern cmd_rsp_status cmd_result; extern flag_status recv_cmp_flag; extern uint8_t bt_flash_data; extern char recv_data[]; extern uartstruct tp_mode_rx_uart; extern uartstruct tp_mode_tx_uart; flag_status UART_TP_MODE = RESET; flag_status switch_mode_flag = RESET; void at_cmd_handler(void); struct at_cmd_msg at_cmd_list[] = { {AT_CMD_IO_SET_LOW, AT_CMD_IOSET0}, {AT_CMD_IO_SET_HIGH, AT_CMD_IOSET1}, {AT_CMD_IO_GET, AT_CMD_IOGET}, }; button_type BUTTON; void AT_Task(void *pvParameters) { printf("AT-Task Start!!\r\n"); while(1){ if(at32_button_press() == USER_BUTTON) { UART_TP_MODE = (flag_status)!UART_TP_MODE; if(UART_TP_MODE) { switch_mode_flag = SET; at_cmd_send(AT_CMD_TP_MODE_ON); while(cmd_rsp_get(AT_TP_MODE_OK1) != RSP_OK); switch_mode_flag = RESET; at32_led_on(LED3); printf("enter uart tp mode\r\n"); } else { switch_mode_flag = SET; at_cmd_send(AT_CMD_TP_MODE_OFF); while(cmd_rsp_get(AT_TP_MODE_OK0) != RSP_OK); switch_mode_flag = RESET; at32_led_off(LED3); printf("leave uart tp mode\r\n"); } } if(UART_TP_MODE) { tp_mode_rx_handler(); tp_mode_tx_handler(); } else { at_cmd_handler(); } vTaskDelay(100); } } /** * @brief handle input at command, it will response corresponding formats. * @param none * @retval none */ void at_cmd_handler(void) { uint8_t msg_id = SIZEOFMSG-1, i; if(recv_cmp_flag == SET) { for(i = 0; i <= SIZEOFMSG; i++) { if(memcmp(recv_data, at_cmd_list.at_cmd_string, strlen(recv_data)) == 0) { printf("%s", recv_data); msg_id = i; break; } } switch(at_cmd_list[msg_id].msg_id) { case AT_CMD_IOSET0: { at32_led_off(LED2); at_cmd_send(AT_RESULT_OK0); break; } case AT_CMD_IOSET1: { at32_led_on(LED2); at_cmd_send(AT_RESULT_OK1); break; } case AT_CMD_IOGET: { if(gpio_output_data_bit_read(GPIOB, GPIO_PINS_7)) { at_cmd_send(AT_RESULT_OK1); } else { at_cmd_send(AT_RESULT_OK0); } break; } default: { at_cmd_send(AT_RSP_ERROR); break; } } recv_cmp_flag = RESET; memset(recv_data, 0, strlen(recv_data)); } } 三、效果演示      [localvideo]943df7b8ef0f761613064e297c0c6ffa[/localvideo]  

  • 发表了日志: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】移植MCU控制蓝牙,蓝牙固件烧录

  • 2022-08-01
  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】在FreeRTOS中ADC采集温度传感器

    【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】在FreeRTOS中ADC采集温度传感器 很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 一、关于ADC及温度传感器     AT32WB415系列产品,内嵌1个12位的模拟/数字转换器(ADC),可以实现单次或序列转换,共享多达8个外部通道和2个内部通道,其中这两个内部通道分别内部连接到温度传感器(VTS) 和内部参考电压(VREFINT)。在序列模式下,自动进行在选定的一组模拟输入上的转换。并且支持DMA操作。😘     每个 ADC 拥有多达 8 个模拟信号通道输入,以 ADC_INx 表示, x=0 至 5、 10、 11。     ADC1_IN0 至 ADC1_IN5、 ADC1_IN10、 ADC1_IN11 为外部模拟输入, ADC1_IN16为内部温度传感器, ADC1_IN17 为内部参考电压。     这样我们就可以知道如何对温度采集了,现在,让我们打印出来😄,关于ADC如何详细配置的问题可以参考技术手册。 二、串口打印     在at32wb415_board文件中,已经为我们写好了PA2的串口输出功能,我可以直接使用。并且已经完成了重映射,极其方便😀 三、各项配置代码     配套代码均在Github中,感兴趣的Clone下来看。 #include "bsp_adc.h" extern __IO uint16_t adc1_ordinary_value; void adc1_config(void) { adc_base_config_type adc_base_struct; crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE); crm_adc_clock_div_set(CRM_ADC_DIV_6); adc_base_default_para_init(&adc_base_struct); adc_base_struct.sequence_mode = FALSE; adc_base_struct.repeat_mode = TRUE; adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT; adc_base_struct.ordinary_channel_length = 1; adc_base_config(ADC1, &adc_base_struct); adc_ordinary_channel_set(ADC1, ADC_CHANNEL_16, 1, ADC_SAMPLETIME_239_5); adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE); adc_dma_mode_enable(ADC1, TRUE); adc_tempersensor_vintrv_enable(TRUE); adc_enable(ADC1, TRUE); adc_calibration_init(ADC1); while(adc_calibration_init_status_get(ADC1)); adc_calibration_start(ADC1); while(adc_calibration_status_get(ADC1)); } void dma_config() { dma_init_type dma_init_struct; crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE); dma_reset(DMA1_CHANNEL1); dma_default_para_init(&dma_init_struct); dma_init_struct.buffer_size = 1; dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_base_addr = (uint32_t)&adc1_ordinary_value; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD; dma_init_struct.memory_inc_enable = FALSE; dma_init_struct.peripheral_base_addr = (uint32_t)&(ADC1->odt); dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_HIGH; dma_init_struct.loop_mode_enable = TRUE; dma_init(DMA1_CHANNEL1, &dma_init_struct); dma_channel_enable(DMA1_CHANNEL1, TRUE); } #include "adc_task.h" #include "FreeRTOS.h" #include "task.h" #include "at32wb415_board.h" __IO uint16_t adc1_ordinary_value = 0; void Adc_Task(void *pvParameters) { printf("internal_temperature_sensor \r\n"); adc_ordinary_software_trigger_enable(ADC1, TRUE); while(1){ while(dma_flag_get(DMA1_FDT1_FLAG) == RESET); dma_flag_clear(DMA1_FDT1_FLAG); printf("internal_temperature = %f deg C\r\n",(ADC_TEMP_BASE - (double)adc1_ordinary_value * ADC_VREF / 4096) / ADC_TEMP_SLOPE + 25); vTaskDelay(300); } } 四、演示视频 [localvideo]cf6facb940b51438b1d9a279c8aecd98[/localvideo]  

  • 2022-07-27
  • 发表了主题帖: 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】在FreeRTOS中点灯,所有代码,Github长期更新

    本帖最后由 KING_阿飞 于 2022-8-1 11:29 编辑 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】在FreeRTOS中点灯,所有代码,Github长期更新 很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的Github:,所有评测代码均开源分享。 一、了解板子资源     雅特力的单片机,这次是我第一次使用,按照我之前的经验。一定要去看数据手册,这个很重要。资料地址:雅特力科技 : 32位微控制器的创新领导者! (arterytek.com) 相比其他国产MCU厂商,雅特力的资料库十分齐全,便于我们开发,这里给雅特力点赞👍👍👍     我们知道在这次给我送测的板子,是板载下载器的。 具体的芯片资源,我就不在这里给出,感兴趣的小伙伴可以去官网查看。 二、移植FreeRTOS  我们首选下载FreeRTOS的源文件,我们可以去FreeRTOS的官网下载:https://www.freertos.org 也可以在官方给的中间件中找到对应的源文件,这里我使用官网下载的最新源码包(FreeRTOS LTS 202012.04)进行移植。 然后在,keil中添加文件FreeRTOS的文件,将相关文件添加。注意:内存那里我们悬着heap_4,虽然我们芯片是ARM-M4带MPU,但是不支持FPU,所以我们这里使用CM3的port。     3.还要再添加一个FreeRTOSConfig.h文件,可以去Github上面看我的(My_AT32WB415_Demo\Middlewares\freertos\FreeRTOS\FreeRTOS-Kernel\include)。     4.最后记得把FreeRTOS的头文件引入。 三、点灯     代码大家直接去Github上面就可以看到,在这里我就不放出。直接看显示效果吧;  

  • 回复了主题帖: 测评入选名单:雅特力AT32WB415系列蓝牙BLE 5.0 MCU,免费抢鲜体验!

    个人信息无误,可以完成计划

最近访客

< 1/1 >

统计信息

已有5人来访过

  • 芯积分:47
  • 好友:--
  • 主题:9
  • 回复:4
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言