找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 186|回复: 0
打印 上一主题 下一主题
收起左侧

py32f030k28单片机开发板NTC温度显示代码

[复制链接]
跳转到指定楼层
楼主
普冉的M0系列MCU PY32F030K28自带的LED数码管驱动,省去了外部驱动IC。本例程演示通过模拟输入PA7引脚采集NTC(热敏电阻)电压计算对应温度并驱动四位LED数码管显示。

  1. /**
  2. ******************************************************************************
  3. * 文件名程: main.c
  4. * 作    者: 邓凯哥
  5. * 功    能: 主函数
  6. * 硬    件: PY32F030K28-StartKit-V0.1
  7. * 软件版本 V0.0.1(2024/4/16 16:02)
  8. ******************************************************************************
  9. **/
  10. #include "main.h"
  11. #include "ntc.h"
  12. #include "timepare.h"

  13. #define LED_DISP_c              0x61        //温度符号小c

  14. /* Private variables ---------------------------------------------------------*/

  15. const uint8_t dispArr[] = {LL_LED_DISP_0, LL_LED_DISP_1, LL_LED_DISP_2, LL_LED_DISP_3, LL_LED_DISP_4, \
  16.                            LL_LED_DISP_5, LL_LED_DISP_6, LL_LED_DISP_7, LL_LED_DISP_8, LL_LED_DISP_9
  17.                           };

  18. int32_t acc_adcval,mean_value;
  19. uint32_t ADC1_Datas[128];
  20. int16_t ADC_ConverDone,adc_count,tempval;
  21. /* Private user code ---------------------------------------------------------*/
  22. /* Private macro -------------------------------------------------------------*/
  23. /* Private function prototypes -----------------------------------------------*/
  24. static void APP_SystemClockConfig(void);
  25. static void APP_AdcConfig(void);
  26. static void APP_AdcEnable(void);
  27. static void APP_AdcCalibrate(void);
  28. static void APP_ConfigLed(void);
  29. static void ADC1_DMA_Config(void);
  30. static void APP_ConfigUsart1(void);

  31. /******************************************************************************
  32. **函数信息 :System_Tick(uint32_t Ticks)           
  33. **功能描述 :系统嘀嗒时钟配置
  34. **输入参数 :Ticks 频率
  35. **输出参数 :无
  36. **说    明 :
  37. ******************************************************************************/                                                  
  38. void System_Tick(uint32_t Ticks)
  39. {
  40.   SysTick->LOAD  = (uint32_t)((SystemCoreClock / Ticks) - 1UL);          /* set reload register */
  41.   SysTick->VAL   = 0UL;                                                       /* Load the SysTick Counter Value */
  42.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  43.                                    SysTick_CTRL_TICKINT_Msk   |
  44.                    SysTick_CTRL_ENABLE_Msk;                                   /* Enable the Systick Timer */
  45. }

  46. /******************************************************************************
  47. **函数信息 :fputc( int data, FILE *f )                  
  48. **功能描述 :重定向fputc函数
  49. **输入参数 :data  要打印字符 , *f  文件指针
  50. **输出参数 :无
  51. **说    明 :
  52. ******************************************************************************/
  53. struct __FILE
  54. {
  55.         int handle;
  56. };

  57. FILE __stdout;

  58. int fputc(int data, FILE *f)
  59. {
  60.   /* Send a byte to USART */
  61.   LL_USART_TransmitData8(USART1, data);
  62.   while (!LL_USART_IsActiveFlag_TC(USART1));
  63.   LL_USART_ClearFlag_TC(USART1);

  64.   return (data);
  65. }

  66. /**
  67.   * @brief  应用程序入口函数.
  68.   * @retval int
  69.   */
  70. int main(void)
  71. {
  72.         /* 配置系统时钟 */
  73.         APP_SystemClockConfig();
  74.         
  75.         /* 配置USART1相关参数 */
  76.         APP_ConfigUsart1();
  77.         
  78.         /* ADC复位 */
  79.         LL_ADC_Reset(ADC1);

  80.         /* ADC模块时钟使能 */
  81.         LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_ADC1);

  82.         /* ADC校准 */
  83.         APP_AdcCalibrate();

  84.         /* 配置ADC相关参数 */
  85.         APP_AdcConfig();
  86.         
  87.         /* 配置ADC DMA参数 */
  88.         ADC1_DMA_Config();
  89.         
  90.         /* 配置LED相关参数 */
  91.         APP_ConfigLed();

  92.         /* 使能ADC */
  93.         APP_AdcEnable();

  94.         /* 开始ADC转换(如果是软件触发则直接开始转换) */
  95.         LL_ADC_REG_StartConversion(ADC1);
  96.         
  97.         /* 开启系统嘀嗒定时器 */
  98.         System_Tick(1000);
  99.         while (1)
  100.         {
  101.         
  102.                 if( TimePare.Tim1ms_flag == 1 )                //1ms任务
  103.                 {
  104.                         TimePare.Tim1ms_flag = 0;
  105.                         if( ++TimePare.Tim10ms_count >= 10 )
  106.                         {
  107.                                 TimePare.Tim10ms_count = 0;
  108.                                 TimePare.Tim10ms_flag = 1;
  109.                         }
  110.                         
  111.                         if( ++TimePare.Tim50ms_count >= 50 )
  112.                         {
  113.                                 TimePare.Tim50ms_count = 0;
  114.                                 TimePare.Tim50ms_flag = 1;
  115.                         }
  116.                 }
  117.                
  118.                
  119.                
  120.                 if( TimePare.Tim10ms_flag == 1 )        //10ms 任务
  121.                 {               
  122.                         
  123.                         TimePare.Tim10ms_flag = 0;
  124.                         if( ++TimePare.Tim100ms_count >= 10 )
  125.                         {
  126.                                 TimePare.Tim100ms_count = 0;
  127.                                 TimePare.Tim100ms_flag = 1;
  128.                         }
  129.                         
  130.                         if( ++TimePare.Tim200ms_count >= 20 )
  131.                         {
  132.                                 TimePare.Tim200ms_count = 0;
  133.                                 TimePare.Tim200ms_flag = 1;
  134.                         }
  135.                 }
  136.                
  137.                
  138.                 if( TimePare.Tim50ms_flag == 1 )        //50ms 任务
  139.                 {
  140.                         
  141.                         TimePare.Tim50ms_flag = 0;
  142.                 }
  143.                
  144.                 if( TimePare.Tim100ms_flag == 1 )        //100ms 任务
  145.                 {
  146.                         
  147.                         TimePare.Tim100ms_flag = 0;
  148.                         if( ++TimePare.Tim500ms_count >= 5 )
  149.                         {
  150.                                 TimePare.Tim500ms_count = 0;
  151.                                 TimePare.Tim500ms_flag = 1;
  152.                         }
  153.                 }
  154.                
  155.                 if( TimePare.Tim200ms_flag == 1 )        //200ms 任务
  156.                 {
  157.                         TimePare.Tim200ms_flag = 0;
  158.                 }
  159.                
  160.                 if( TimePare.Tim500ms_flag == 1 )        //500ms 任务
  161.                 {
  162.                         ///显示NTC温度
  163. //                        LL_LED_SetDisplayValue(LED, LL_LED_COM0, dispArr[(tempval) /100]);
  164.                         LL_LED_SetDisplayValue(LED, LL_LED_COM1, dispArr[(tempval) %100/10]);
  165.                         LL_LED_SetDisplayValue(LED, LL_LED_COM2, dispArr[(tempval) %100%10]);
  166.                         LL_LED_SetDisplayValue(LED, LL_LED_COM3, LED_DISP_c);
  167.                         
  168.                         printf("ADC_VALUE = %d,   NTC_VALUE = %d\r\n",mean_value, tempval);          //串口打印ADC数值和NTC温度值
  169.                         
  170.                         TimePare.Tim500ms_flag = 0;
  171.                         if( ++TimePare.Tim1s_count >= 2 )
  172.                         {
  173.                                 TimePare.Tim1s_count = 0;
  174.                                 TimePare.Tim1s_flag = 1;
  175.                         }
  176.                 }
  177.                
  178.                 if( TimePare.Tim1s_flag == 1 )                //1000ms 任务
  179.                 {
  180.                         TimePare.Tim1s_flag = 0;
  181.                 }

  182.         }
  183. }


  184. /**
  185.   * @brief  系统时钟配置函数
  186.   * @param  无
  187.   * @retval 无
  188.   */
  189. static void APP_SystemClockConfig(void)
  190. {
  191.         /* 使能HSI */
  192.         LL_RCC_HSI_Enable();
  193.         LL_RCC_HSI_SetCalibFreq(LL_RCC_HSICALIBRATION_24MHz);
  194.         while(LL_RCC_HSI_IsReady() != 1)
  195.         {
  196.         }

  197.         /* 设置 AHB 分频*/
  198.         LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);

  199.         /* 配置HSISYS作为系统时钟源 */
  200.         LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSISYS);
  201.         while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSISYS)
  202.         {
  203.         }

  204.         /* 设置 APB1 分频*/
  205.         LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  206.         LL_Init1msTick(24000000);

  207.         /* 更新系统时钟全局变量SystemCoreClock(也可以通过调用SystemCoreClockUpdate函数更新) */
  208.         LL_SetSystemCoreClock(24000000);
  209. }

  210. /**
  211.   * @brief  USART配置函数
  212.   * @param  USARTx:USART模块,可以是USART1、USART2
  213.   * @retval 无
  214.   */
  215. static void APP_ConfigUsart1(void)
  216. {
  217.         /*使能GPIOA时钟*/
  218.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  219.         /*使能USART1时钟*/
  220.         LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);

  221.         /*GPIOA配置*/
  222.         LL_GPIO_InitTypeDef GPIO_InitStruct;
  223.         /*选择PA9引脚*/
  224.         GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  225.         /*选择复用模式*/
  226.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  227.         /*选择输出速度*/
  228.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  229.         /*选择输出模式*/
  230.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  231.         /*选择上拉*/
  232.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  233.         /*复用为USART1功能*/
  234.         GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1;
  235.         /*GPIOA初始化*/
  236.         LL_GPIO_Init(GPIOA,&GPIO_InitStruct);

  237.         /*选择PA10引脚*/
  238.         GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
  239.         /*复用为USART1功能*/
  240.         GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1;
  241.         /*GPIOA初始化*/
  242.         LL_GPIO_Init(GPIOA,&GPIO_InitStruct);

  243.         /*配置USART功能*/
  244.         LL_USART_InitTypeDef USART_InitStruct;
  245.         /*设置波特率*/
  246.         USART_InitStruct.BaudRate = 9600;
  247.         /*设置数据长度*/
  248.         USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  249.         /*停止位*/
  250.         USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  251.         /*设置校验位*/
  252.         USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  253.         USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  254.         USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  255.         USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  256.         /*USART1初始化*/
  257.         LL_USART_Init(USART1, &USART_InitStruct);

  258.         /*配置为全双工异步模式*/
  259.         LL_USART_ConfigAsyncMode(USART1);

  260.         /*使能UART1模块*/
  261.         LL_USART_Enable(USART1);
  262. }

  263. /**
  264.   * @brief  ADC校准函数
  265.   * @param  无
  266.   * @retval 无
  267.   */
  268. static void APP_AdcCalibrate(void)
  269. {
  270.   __IO uint32_t wait_loop_index = 0;
  271.   __IO uint32_t backup_setting_adc_dma_transfer = 0;
  272. #if (USE_TIMEOUT == 1)
  273.   uint32_t Timeout = 0;
  274. #endif

  275.   if (LL_ADC_IsEnabled(ADC1) == 0)
  276.   {
  277.     /* 校准时关闭ADC的DMA配置 */
  278.     backup_setting_adc_dma_transfer = LL_ADC_REG_GetDMATransfer(ADC1);
  279.     LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_NONE);
  280.     /* 使能校准 */
  281.     LL_ADC_StartCalibration(ADC1);

  282. #if (USE_TIMEOUT == 1)
  283.     Timeout = ADC_CALIBRATION_TIMEOUT_MS;
  284. #endif

  285.     while (LL_ADC_IsCalibrationOnGoing(ADC1) != 0)
  286.     {
  287. #if (USE_TIMEOUT == 1)
  288.       /* 检测校准是否超时 */
  289.       if (LL_SYSTICK_IsActiveCounterFlag())
  290.       {
  291.         if(Timeout-- == 0)
  292.         {

  293.         }
  294.       }
  295. #endif
  296.     }

  297.     /* ADC校准结束和使能ADC之间的延时最低4个ADC Clock */
  298.     LL_mDelay(1);

  299.     /* 还原ADC的DMA配置 */
  300.     LL_ADC_REG_SetDMATransfer(ADC1, backup_setting_adc_dma_transfer);
  301.   }
  302. }

  303. /**
  304.   * @brief  ADC配置函数
  305.   * @param  无
  306.   * @retval 无
  307.   */
  308. static void APP_AdcConfig(void)
  309. {
  310.         /* 使能GPIOA时钟 */
  311.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);

  312.         /* 配置管脚PA7为模拟输入 */
  313.         LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_7, LL_GPIO_MODE_ANALOG);

  314.         /* ADC通道和时钟源需在ADEN=0时配置,其余的需在ADSTART=0时配置 */
  315.         /* 配置内部转换通道 */
  316.         LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_NONE);

  317.         /* 设置ADC时钟 */
  318.         LL_ADC_SetClock(ADC1, LL_ADC_CLOCK_SYNC_PCLK_DIV2);

  319.         /* 设置12位分辨率 */
  320.         LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_12B);

  321.         /* 设置数据右对齐 */
  322.         LL_ADC_SetResolution(ADC1, LL_ADC_DATA_ALIGN_RIGHT);

  323.         /* 设置低功耗模式无 */
  324.         LL_ADC_SetLowPowerMode(ADC1, LL_ADC_LP_MODE_NONE);

  325.         /* 设置通道转换时间 */
  326.         LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_239CYCLES_5);

  327.         /* 设置触发源为Software */
  328.         LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_SOFTWARE);

  329.         /* 设置转换模式为连续转换 */
  330.         LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS);

  331.         /* 设置DMA模式为循环 */
  332.         LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);

  333.         /* 设置过载管理模式为覆盖上一个值 */
  334.         LL_ADC_REG_SetOverrun(ADC1, LL_ADC_REG_OVR_DATA_OVERWRITTEN);

  335.         /* 使用PA7  ADC通道7,扫描方向必须为向上 */
  336.         LL_ADC_REG_SetSequencerScanDirection(ADC1,LL_ADC_REG_SEQ_SCAN_DIR_FORWARD);

  337.         /* 设置非连续模式为不使能 */
  338.         LL_ADC_REG_SetSequencerDiscont(ADC1, LL_ADC_REG_SEQ_DISCONT_DISABLE);

  339.         /* 设置通道7为转换通道 */
  340.         LL_ADC_REG_SetSequencerChannels(ADC1,LL_ADC_CHANNEL_7);

  341. }

  342. /**
  343.   * @brief  ADC使能函数
  344.   * @param  无
  345.   * @retval 无
  346.   */
  347. static void APP_AdcEnable(void)
  348. {
  349.   /* 使能ADC */
  350.   LL_ADC_Enable(ADC1);

  351.   /* 使能ADC 稳定时间,最低8个ADC Clock */
  352.   LL_mDelay(1);
  353. }


  354. /**
  355.   * @brief  配置LED数码管
  356.   * @param  无
  357.   * @retval 无
  358.   */
  359. static void APP_ConfigLed(void)
  360. {
  361.         /* 使能时钟 */
  362.         LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_LED);
  363.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
  364.         LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);

  365.         LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  366.         /* 配置 PB3, PB4, PB5 为 com1 com2 com3 */
  367.         GPIO_InitStruct.Pin = LL_GPIO_PIN_3 | LL_GPIO_PIN_4 | LL_GPIO_PIN_5;
  368.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  369.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  370.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  371.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  372.         GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  373.         LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  374.         /* 配置 PA15 为 com0 */
  375.         GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
  376.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  377.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  378.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  379.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  380.         GPIO_InitStruct.Alternate = LL_GPIO_AF_6;
  381.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  382.         /* 配置 PA0, PA1, PA2, PA3, PA4, PA5, PA6 为 SEG B C D E F G DP */
  383.         GPIO_InitStruct.Pin = LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_2 | LL_GPIO_PIN_3 | \
  384.                                                 LL_GPIO_PIN_4 | LL_GPIO_PIN_5 | LL_GPIO_PIN_6;
  385.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  386.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  387.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  388.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  389.         GPIO_InitStruct.Alternate = LL_GPIO_AF_3;
  390.         LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  391.         /* 配置 PB8 为 SEG A */
  392.         GPIO_InitStruct.Pin = LL_GPIO_PIN_8;
  393.         GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  394.         GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  395.         GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  396.         GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  397.         GPIO_InitStruct.Alternate = LL_GPIO_AF_3;
  398.         LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  399.         /* 设置 LED COM 驱动能力 */
  400.         LL_LED_SetComDrive(LED, LL_LED_COMDRIVE_LOW);

  401.         /* 设置 COM 打开数 */
  402.         LL_LED_SetComNum(LED, LL_LED_COMSELECT_4COM);

  403.         /* 设置 LED 预分频值 */
  404.         LL_LED_SetPrescaler(LED, 9);

  405.         /* 设置 LED 点亮和切换时间 */
  406.         LL_LED_SetLightAndDeadTime(LED, 0xf0, 0x10);

  407.         /* 使能 LED */
  408.         LL_LED_Enable(LED);
  409. }

  410. /******************************************************************************
  411. **函数信息 : ADC1_DMA_Config(void)               
  412. **功能描述 :ADC1 DMA通道配置
  413. **输入参数 :无
  414. **输出参数 :无
  415. **说    明 :
  416. ******************************************************************************/
  417. void ADC1_DMA_Config()
  418. {
  419.   /* 使能DMA1 时钟 */
  420.   LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);

  421.   /* 使能syscfg 时钟 */
  422.   LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SYSCFG);

  423.   /* ADC对应通道LL_DMA_CHANNEL_1 */
  424.   SET_BIT(SYSCFG->CFGR3, 0x0);

  425.   /* 配置DMA传输方向为外设到存储器 */
  426.   LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  427.   /* 配置DMA优先级为高 */
  428.   LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);

  429.   /* 配置DMA循环模式 */
  430.   LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);

  431.   /* 配置DMA外设地址不变模式 */
  432.   LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);

  433.   /* 配置DMA存储地址自增模式 */
  434.   LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);

  435.   /* 配置DMA外设传输方式为字 */
  436.   LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);

  437.   /* 配置DMA存储器传输方式为字 */
  438.   LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_WORD);

  439.   /* 配置DMA传输长度为128 */
  440.   LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 128);

  441.   /* 配置DMA外设和存储器的地址 */
  442.   LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_1, (uint32_t)&ADC1->DR,\
  443.                          (uint32_t)ADC1_Datas, LL_DMA_GetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1));

  444.   /* 使能DMA传输完成中断 */
  445.   LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1);

  446.   /* DMA中断配置 */
  447.   NVIC_SetPriority(DMA1_Channel1_IRQn, 0);
  448.   NVIC_EnableIRQ(DMA1_Channel1_IRQn);

  449.   /* 使能DMA */
  450.   LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
  451. }
  452. /******************************************************************************
  453. **函数信息 : ADC_DMATransferCompleteCallback(void)               
  454. **功能描述 :ADC中断回调
  455. **输入参数 :无
  456. **输出参数 :无
  457. **说    明 :
  458. ******************************************************************************/
  459. void ADC_DMATransferCompleteCallback()
  460. {
  461.         uint8_t i;
  462.         acc_adcval = 0;
  463.         for( i=0; i<128; i++)
  464.         {
  465.                 acc_adcval += ADC1_Datas[i];
  466.         }
  467.         mean_value = acc_adcval >>7;                //求128次ADC采样的平均值,用移位比除法运算更高效
  468.         tempval =  ADC_Get_TempValue( mean_value);
  469. }

  470. /**
  471.   * @brief  错误执行函数
  472.   * @param  无
  473.   * @retval 无
  474.   */
  475. void APP_ErrorHandler(void)
  476. {
  477.   /* 无限循环 */
  478.   while (1)
  479.   {
  480.   }
  481. }

  482. #ifdef  USE_FULL_ASSERT
  483. /**
  484.   * @brief  输出产生断言错误的源文件名及行号
  485.   * @param  file:源文件名指针
  486.   * @param  line:发生断言错误的行号
  487.   * @retval 无
  488.   */
  489. void assert_failed(uint8_t *file, uint32_t line)
  490. {
  491.   /* 用户可以根据需要添加自己的打印信息,
  492.      例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  493.   /* 无限循环 */
  494.   while (1)
  495.   {
  496.   }
  497. }
  498. #endif /* USE_FULL_ASSERT */
复制代码


代码下载:

PCB_PCB_PY32F030K2_KFB_V0.2_2024-04-28.pdf

112.85 KB, 下载次数: 8, 下载积分: 黑币 -5

PY32F030K2开发板NTC源码.7z

1.09 MB, 下载次数: 13, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表