stm32使用笔记

news2024/9/21 22:29:26

stm32外设使用

  • 1. adc使用
  • 2. uart使用

1. adc使用

参考文章
在这里插入图片描述

static void MX_Adc_DMA_Init(void)
{
    /* DMA controller clock enable */
    __HAL_RCC_DMA1_CLK_ENABLE();

    /* DMA interrupt init */
    /* DMA1_Channel1_IRQn interrupt configuration */
    HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
}
static int MX_ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};
    // ------------------DMA Init 结构体参数 初始化--------------------------
	MX_Adc_DMA_Init();  // 必须在前面
    /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */
    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    hadc1.Init.Resolution = ADC_RESOLUTION_8B;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    hadc1.Init.LowPowerAutoWait = DISABLE;
    hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.NbrOfConversion = 1;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    hadc1.Init.DMAContinuousRequests = ENABLE;
    hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
    hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5;
    hadc1.Init.OversamplingMode = DISABLE;
    hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        Error_Handler();
    }

    /** Configure Regular Channel
    */
    sConfig.Channel = ADC_CHANNEL_1;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }

    /* USER CODE BEGIN ADC1_Init 2 */
    HAL_ADCEx_Calibration_Start(&hadc1);
    /* USER CODE END ADC1_Init 2 */
    // HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc_value, sizeof(adc_value)  / 2 - 8);

    return 0;
}

/**
  * @brief  ADC 中断回调函数
  * @param  None
  * @retval None
  */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
	HAL_ADC_Stop_DMA(AdcHandle);
	// HAL_ADC_Start_DMA(AdcHandle, (uint32_t*)&adc_val, 1);
	// uint16_t val = HAL_ADC_GetValue(AdcHandle);
	// printf("adc -> %d\n",adc_val[0]);
	ecbm_modbus_cmd_write_reg(LED_ADC, adc_val[0]);
}

2. uart使用

uart配饰初始化


    /* DMA 必须在前初始化 */
    __HAL_RCC_DMA1_CLK_ENABLE();
    HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
       /* usart init */
    dev->uart.Init.BaudRate = baudrate;
    dev->uart.Init.WordLength = UART_WORDLENGTH_8B;
    dev->uart.Init.StopBits = UART_STOPBITS_1;
    dev->uart.Init.Parity = UART_PARITY_NONE;
    dev->uart.Init.Mode = UART_MODE_TX_RX;
    dev->uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    dev->uart.Init.OverSampling = UART_OVERSAMPLING_16;
    dev->uart.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    dev->uart.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    dev->uart.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if (HAL_UART_Init(&dev->uart) != HAL_OK)
    {
    
    }

msp 中初始化

        RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
        /* USER CODE END USART1_MspInit 0 */
        /* Peripheral clock enable */
        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
        PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
        {
            Error_Handler();
        }

        /* Peripheral clock enable */
        __HAL_RCC_USART1_CLK_ENABLE();

        __HAL_RCC_GPIOA_CLK_ENABLE();
 
        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        /* USART1_RX Init */
        hdma_usart1_rx.Instance = DMA1_Channel1;
        hdma_usart1_rx.Init.Request = DMA_REQUEST_USART1_RX;
        hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
        hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
        hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
        hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;
        hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
        if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
        {
            Error_Handler();
        }

        __HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx);

        /* USART1 interrupt Init */
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);

中断服务函数

void USART1_IRQHandler(void)
{
    uint32_t tmp_flag = 0;
    uint32_t temp;
    tmp_flag =__HAL_UART_GET_FLAG(&modbus_dev.uart, UART_FLAG_IDLE);                  // 获取IDLE标志使
    if((tmp_flag != RESET))                                                      // idle标志被置使
    {
        __HAL_UART_CLEAR_IDLEFLAG(&modbus_dev.uart);                                  // 清除标志使
        HAL_UART_DMAStop(&modbus_dev.uart);

        temp =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);                          // 获取DMA中未传输的数据个敿
        modbus_dev.r_len = sizeof(modbus_dev.r_buf) - temp;                                // 总计数减去未传输的数据个数,得到已经接收的数据个敿

        rt_sem_release(&modbus_dev.rece_sem);
        //HAL_UART_Transmit(&uart2.uart, uart2.r_buf, uart2.r_len, 1000);
    }

    //HAL_UART_Receive_DMA(&uart2.uart, (uint8_t*)uart2.r_buf, sizeof(uart2.r_buf));
    HAL_UART_IRQHandler(&modbus_dev.uart);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能应用中的恐怖谷效应是什么?

人工智能应用中的恐怖谷效应是什么? 引言 随着人工智能、机器人技术和计算机图形学的发展,越来越逼真的人形机器人、虚拟角色和动画形象开始出现。然而,尽管这些技术进步令人惊叹,它们也带来了一个有趣而复杂的心理现象&#xf…

应急响应:Linux 入侵排查思路.

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了,你怎么把这个攻击还原,看看别人是怎么攻击的,然后你如何去处理,这就是应急响应。 目录&…

引领企业全球化发展 极光亮相华为亚太ICT峰会2024·泰国

近日,华为亚太ICT峰会2024泰国正式开幕,极光(Aurora Mobile,纳斯达克股票代码:JG)凭借其创新的技术实力与前瞻性的产品布局,受邀出席本次活动。会上,极光展示了其全域消息通知解决方…

【C语言篇】C语言常考及易错题整理DAY1

文章目录 C语言常考及易错题整理选择题全局、局部和静态变量#define与typedef转义字符操作符循环其他 编程题计算日期到天数转换柯尼希定理旋转数组的最小数字描述错误的集合整数转换密码检查 C语言常考及易错题整理 选择题 全局、局部和静态变量 执行下面程序,正…

表操作数据库练习

1.一个关系数据库文件中的各条记录 ( ) A.前后顺序不能任意颠倒,一定要按照输入的顺序排列 B.前后顺序可以任意颠倒,不影响库中的数据关系 C.前后顺序可以任意颠倒,但排列顺序不同,统计处理的结果就可…

人工智能-自然语言处理(NLP)

人工智能-自然语言处理(NLP) 1. NLP的基础理论1.1 语言模型(Language Models)1.1.1 N-gram模型1.1.2 词嵌入(Word Embeddings)1.1.2.1 词袋模型(Bag of Words, BoW)1.1.2.2 TF-IDF&a…

SDL 锁屏视频卡死bug原因

最近在封装播放库,我用的是FFMPEGSDL库封装,这个库其实用起来不难,因为网上可供参考的资源也多,所以我自己也封装了一个,但是播放视频时只要我电脑一锁屏再重新打开,我靠视频卡住不动了,我调试看…

两种图像透明背景转特定颜色方法的比较

之前写过一篇博客,关于透明背景转换为特定颜色,当时使用了NumPy数组采用布尔索引转换的方式,这次我们把这种转换和常规的逐像素转换的方式进行比较,看那种方法效率更高。记得以前使用Matlab的时候,显然是矩阵布尔索引的…

yolov8/yolov10 MLU370 实现推理/单多卡训练!

文章目录 前言一、平台环境配置二、基础环境配置1.代码下载2.环境安装3.模型下载4.代码修改 三.单卡推理四、单/多卡训练 前言 本章主要操作以yolov8为主,但是yolov10用该操作也能直接适用,开干! 一、平台环境配置 镜像选择:v2…

spring boot(学习笔记第十七课)

spring boot(学习笔记第十七课) Spring boot的Apache ActiveMQ 学习内容: Spring boot的Apache ActiveMQ 1. Spring boot的Apache ActiveMQ 什么是JMS(Java Message Service) JMS(Java Message Service)就是Java消息服…

Fultter项目中IOS打包问题整理(附带解决方案)

Fultter项目中IOS打包问题整理(附带解决方案) 问题一:CocoaPods 在你的项目中找不到名为 AlicloudPush 版本为 ~> 1.9.1 的 Pod 规范。报错信息问题分析解决方法 问题二:ruby版本问题报错信息问题分析问题原因解决方法 问题三&…

squeeze()和unsequeeze()函数的作用

sequeeze(dim):用于在指定位置添加一个大小为1的新维度 例如: 其他的大家自行尝试! squeeze():squeeze函数用于去除张量中所有大小为1的维度,注意当没有传入任何参数的时候,去掉的是所有大小为1的维度。 例如:

力扣第五十九题——螺旋矩阵II

内容介绍 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n 1 …

基于SpringBoot的网络海鲜市场系统的设计与实现

TOC springboot219基于SpringBoot的网络海鲜市场系统的设计与实现 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大,人为计算方面才是一个巨大的短板,所以发明了各种计算设备,从结绳记事,到算筹,以及算盘&…

【ubuntu24.04】远程开发:微软RDP;ssh远程root登录;clion以root远程

本地配置了一台ubutnu服务器,运行各种服务。偶尔会远程过去,做一些UI操作。感觉nomachine的就是会模糊一些,可能是默认的编码比较均衡?RDP更清晰? RDP 与nomachine比,更清晰,但是貌似不支持自动缩放窗口?默认的配置就比较高:GPT的建议 安装xrdp还要配置session:1. 安…

从零开始搭建k8s集群详细步骤

声明:本文仅作为个人记录学习k8s过程的笔记。 节点规划: 两台节点为阿里云ECS云服务器,操作系统为centos7.9,master为2v4GB,node为2v2GB,硬盘空间均为40GB。(节点基础配置不低于2V2GB) 主机名节点ip角色部…

链表(linked_list)的理解以及实现

链表的概念: 链表是一种线性数据结构,其中的每个元素都是一个节点对象,各个节点通过“引用”相连接。引用记录了下一个节点的内存地址,通过它可以从当前节点访问到下一个节点。 可以看出:链表物理结构不是连续的 链…

在Ubuntu 13.10上安装Hadoop的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 先决条件 本教程的唯一先决条件是安装了 Ubuntu 13.10 x64 的 VPS。 您需要通过以下两种方式之一在命令行中执行命令: 使用…

AI芯片:高性能卷积计算中的数据复用

随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中需要优化的重点之一&a…

XSS游戏前五关

分享一个XSS游戏的链接 XSS Game 第一关&#xff1a; 这边有一个innerHTML属性&#xff0c;我们查看官方文档 我们找到了它存在的漏洞&#xff0c;直接利用 https://sandbox.pwnfunction.com/warmups/ma-spaghet.html?somebody<img src1 onerror"alert(1337)&quo…