tag 标签: stm32

相关帖子
相关博文
  • 热度 3
    2021-1-15 21:49
    157 次阅读|
    2 个评论
    【ART-Pi开发板】+RT-Thread Studio实现快速开发
    众所周知,RTT是国产RTOS中佼佼者,不光光是因为其OS本身,还是因为其构建了良好的开发生态环境。包括丰富的中间件,友好的版本控制体系,以及自主开发的IDE—— RT-Thread Studio 。那么今天我们就利用RT-Thread Studio迅速搭建了个flashLEDdemo。 当然,首先你得安装RT-Thread Studio,这就不赘述了,附上下载链接: https://www.rt-thread.org/page/download.html 。双击打开IDE,点击SDK manager,我们要找到我们这块板卡的SDK以及H7的内核库文件,看下,ART-Pi的SDK是依赖于H7内核库的,如果之前没有安装H7库文件的话,IDE会提示先安装,安装完了再去安装基于ART-Pi的SDK即可。 库文件都安装完毕以后我们就可以新建项目了。点击文件——新建——RT-Thread项目。弹出对话框后,先输入我们的项目名称,然后点选基于开发板,开发板我们选择STM32H750-RT-ART-Pi,类型我们选择实例工程,示例选择我们所需要的flashLED,其他默认即可,因为板卡自带STLink所以调试器就选择STLink。 点击完成后,IDE会自动生成demo工程,既然是demo,那么我们暂时不需要写自己的代码就能实现功能了,首先我们点击debug按钮。说明一下这里的debug按钮是不会下载程序的,可以理解为编译俺就,点击就等于编译工程,看有没有语法错误。 OK,很明显,编译不出意外不会报错,我们把硬件接上,说明一下,烧写程序,我们要把调试线接在板卡的USB-DBG端,这个是STlink下载接口,如图, 在下载程序之前,我们点击配置按键,在download标签页里面确认一下片外flash启动算法,这也是我们为什么后续开发要基于demo程序的原因,可以直接利用这个算法,从片外flash启动程序。我们点击下载按钮即可把程序下载到板卡里面了。 到这里应该重新上电程序就能运行了,但是要注意,这时下载线要换个接口了,要接在USB-OTG端口,否则程序不会运行,这个不知道为啥,估计我太菜无法解释。 至此,可以看到,我们可以利用demo迅速开发我们相关应用,起码硬件上是调通了。后续会展示一些简单应用。
  • 热度 6
    2020-12-25 14:56
    967 次阅读|
    1 个评论
    使用DMA 进行AD采样很方便,但需要事先设置好通道。如果有过程中希望修改通道,可以先做一个DeInit 然后设置不同的Rank // Adc 通道配置 选择 vdc vbat preu pred void ADC1_misc_Init(void) { ADC_ChannelConfTypeDef sConfig; HAL_ADC_DeInit(&hadc1); /**Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; if (HAL_ADC_Init(&hadc1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_12; // bdc sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_13; // vbat sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; // preu sConfig.Rank = ADC_REGULAR_RANK_3; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_7; // pred sConfig.Rank = ADC_REGULAR_RANK_4; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } // adc1 通道配置 bub pos void ADC1_ir_Init(void) { ADC_ChannelConfTypeDef sConfig; HAL_ADC_DeInit(&hadc1); /**Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 2; if (HAL_ADC_Init(&hadc1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_5; // position sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_6; // bubble sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } 在启动转换时,依据设置的通道数,选择不同的DMA空间 void StartADC1Misc(void){ HAL_ADC_Start_DMA(&hadc1, ADC1Buf.ValMem,ADCCNT*4); } void StartADC1IR(void){ HAL_ADC_Start_DMA(&hadc1, IRBuf.ValMem,ADCCNT*2); } 获取采样值的时候,找到对应的缓冲区 uint32_t AdcGetValue(uint8_t ch){ uint32_t temp,i; temp = 0; for(i = ADCCNT/2-5;i< ADCCNT/2+5;i++){ temp = temp+ (ADC1Buf.Val &0xFFF); } temp /= 10; return temp; } uint32_t AdcGetIRValue(uint8_t ch){ uint32_t temp,i; temp = 0; for(i = ADCCNT/2-5;i< ADCCNT/2+5;i++){ temp = temp+ (IRBuf.Val &0xFFF); } temp /= 10; return temp; }
  • 热度 2
    2020-12-17 09:11
    968 次阅读|
    0 个评论
    【不用开发板学习STM32】7段数码管0~9定时显示(文末获取代码及工程文件)
    本实验是通过7个IO口控制一个共阳7段数码管,分别从0~9依次显示。时间间隔200ms刷新一次。系统时钟源是内部8MHz晶振,具体原因上一期已经讲述过了,时钟倍频位40MHz,使用了TIM2定时器,数码管刷新在TIM2中断函数中完成。同时利用systick来计时,控制一个LED灯间歇闪烁。工程师如果对STM32F10x系列怎么使用内部时钟有疑问可以参考这里的代码,都是在实际开发板上测试过,和用Proteus仿真结果是一致的。 TIM2初始化,这里设置是200ms进一次中断,系统时钟是40MHz,并且配置好TIM2的中断,代码如下: void bsp_InitTIM2(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; uint32_t usPeriod; /* 开启TIM2的时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); usPeriod = 2000; //重装载数值 200ms /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = usPeriod; TIM_TimeBaseStructure.TIM_Prescaler = 3999; //设置分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //开启TIM2中断 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); /* TIMx enable */ TIM_Cmd(TIM2, ENABLE); { /* 配置定时器中断 */ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } } 代码及工程下载链接!! https://t.1yb.co/axri
  • 热度 6
    2020-9-24 12:06
    1150 次阅读|
    1 个评论
    STM32 串口 DMA方式接收数据及数据处理方法
    通常我们都使用中断方式接收串口数据。用DMA方式接收,效率会更高。 先在CUBE中设置一下。 使用 UART DMA 接收功能,并使用 Circular 模式。收到的数据将循环放在缓冲区里。 #define BUFFERSIZE 128 uint8_t Uart1RxBuf ; // 软件中定义一个接收缓冲区 uint16_t curchr,lastchr; // 指向当前未处理过的字符和最后一个字符。 HAL_UART_Receive_DMA(&huart1,Uart1RxBuf,BUFFERSIZE); // 程序初始化时,需要启动一次 UART DMA 接收。 /* 需要定时查询是否收到数据。 */ NDTR; // NDTR 指示存储空间的剩余长度 if(curchr != lastchr) { LEDRUNON(); // 指示收到一个数据包 SerialParse(Uart1RxBuf,&curchr,lastchr); } 找 SerialParse 寻找自定协议中的数据包的头和尾。 因为数据是循环接收的,有可能一个数据包会分布在缓冲区尾部和头部。索引时,需要取模运算。 (data == 'E')&&(data == 'R')&&(data == 'R') 好处就是,串口一直接收着,不会丢掉任何数据,只要合理的缓冲区长度,并及时处理数据。能达到很高的速度且不丢包。
  • 热度 5
    2020-8-29 08:30
    957 次阅读|
    1 个评论
    使用 timer 产生脉冲波形,控制步进电机转动。当使用微步方式时,脉冲频率等于整步频率乘以细分数。有时,我们需要每步进行处理,也就是在发出脉冲时,产生中断。对于常用的双极步进电机,最快的速度大概是 2000PPS ,也就是一秒钟 10 圈。如果使用 256 细分,则输出脉冲频率为 512K ,这么高频率的中断,显然有问题。 有个方法,可以降低中断数量。 可以使用两个 TIMER ,其中一个用于产生电机控制脉冲。常规的办法是使用 50% 点空比的 PWM 脉冲。 使用两个 TIMER ,其中一个设置为 PWM 输出,另外不个设置为 PWM 无输出 void MOT_StartPPS(uint16_t para){ uint16_t temp; PSC = 99; temp = 0xFFFF ; ARR = temp - 1; CCR2 = temp / 2; PSC = 256*100-1; temp = 0xFFFF; ARR = temp - 1; CCR1 = temp / 2; 。。。。。。 HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2); HAL_TIM_PWM_Start_IT(&htim16,TIM_CHANNEL_1); } 对于较高的速度,需要斜坡启动,所以将 PWM 脉冲重复频率设置为最慢,启动 PWM 输出,同时启动另一个 TIMER 的中断输出(这里我们只要中断,不要输出)。 随后在程序中,定时运行步述代码,逐步将频率提高,直到达到设定值。 if(ppsstart == 1){ if((mscnt % SLOPINT)==0){ ppsratenow += SLOPINCPPS; if(ppsratenow < ppsrate){ temprate = ppsratenow; } else{ temprate = ppsrate; ppsstart = 0; ppsratenow = 0; } PSC = 50/temprate; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; ARR = temp - 1; //48000000 / 51200 * para / (para / 100 +1); //para 秒 / 圈 频率 = SYSCLK / ( 256 * para) CCR2 = temp / 2; PSC = 256*(50/temprate + 1)-1; temp = (48000000 / 256) / temprate / (50/temprate + 1) ; ARR = temp - 1; CCR1 = temp / 2; 两个 TIMER 计数时钟是相同的,所以产生的脉冲是同相位的。但因为其中一个预先分频要慢细分数,所以产生中断的速度等于步进电机整步速度。这样中断的速度就降低了细分倍。如果对步数精度要求不高,可以将预分频倍数进一步提高,这样可以让电机转数步,才产生一个中断。
相关资源
广告