STM32 Alternate functions 与 Additional functions

STM32 Alternate functions 与 Additional functions

STM32 MCU的IO引脚可以作为GPIO功能(绝大部分IO上电后的默认为该模式),也可以作为Alternate functions(复用功能)和 Additional functions(附加功能、辅助功能)。

Alternate functions:Functions selected through GPIOx_AFR registers
即需要通过GPIOx_AFR寄存器配置来选择。

Additional functions:Functions directly selected/enabled through peripheral registers
即直接通过相应外设寄存器打开或关闭。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "bsp_lm35d.h" extern __IO uint16_t ADC_ConvertedValue; PID_Float mPIDstruct; /*  * 函数名:TempratureCtrl_GPIO_Config  * 描述  :配置温度控制用到的I/O口  * 输入  :无  * 输出  :无  */ void TempratureCtrl_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(TEMPCTRL_CLK,ENABLE); /* DS18B20 GPIO config */ /* Configure DS18B20 Dout (PA.0) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = TEMPCTRL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(TEMPCTRL_PORT, &GPIO;_InitStructure); //设置初始状态拉高 GPIO_SetBits(TEMPCTRL_PORT, TEMPCTRL_PIN); } /*  * 温度范围0-100℃,电压每提高10mV温度升高1摄氏度  *   * 温度 = ADC_ConvertedValue/4096*3.3v/(10/1000)v*1 = ADC_ConvertedValue * 0.08056640625  */ float LM35D_Get_Temp(void) { return (ADC_ConvertedValue * 0.08056640625); } /********************************************************************  函 数 名:void Init_PID_uint(PID_uint *p) 功    能:初始化PID参数 说    明:调用本函数之前,应该先对Kp,Ti,Td做设置        ,简化了公式   入口参数:PID单元的参数结构体 地址 返 回 值:无 ***********************************************************************/ void Init_PID_uint(PID_Float *p) {         p->k1=(p->Kp)+(p->Kp)*1024.0/(p->Ti)+(p->Kp)*(p->Td)/1024.0;         p->k2=(p->Kp)+2*(p->Kp)*(p->Td)/1024.0;         p->k3=(p->Kp)*(p->Td)/1024.0; } /********************************************************************  函 数 名:void reset_Uk(PID_Uint *p) 功    能:初始化U_kk,ekk,ekkk 说    明:在初始化时调用,改变PID参数时有可能需要调用       入口参数:PID单元的参数结构体 地址 返 回 值:无 ***********************************************************************/ void reset_Uk(PID_Float *p) {         p->U_kk=0;         p->ekk=0;         p->ekkk=0; } /********************************************************************  函 数 名:void SetPIDProperty(float ur,float kp,float ti,float td,float un,PID_Float *p) 功    能:初始化U_kk,ekk,ekkk 说    明:在初始化时调用,改变PID参数时有可能需要调用 入口参数:PID单元的参数结构体 地址 返 回 值:无 ***********************************************************************/ void SetPIDProperty(float ur,float kp,float ti,float td,float un) { mPIDstruct.Ur = ur;//限幅输出值 mPIDstruct.Kp = kp;//比例,从小往大调 mPIDstruct.Ti = ti;//积分,从大往小调 mPIDstruct.Td = td;//微分 mPIDstruct.Un = un;//不灵敏区  reset_Uk(&mPIDstruct;); Init_PID_uint(&mPIDstruct;); } /********************************************************************  函 数 名:int PID_commen(int set,int jiance,PID_Uint *p) 功    能:通用PID函数 说    明:求任意单个PID的控制量 入口参数:期望值,实测值,PID单元结构体 返 回 值:PID控制量 ***********************************************************************/ float PID_common(float set,float jiance) { float ek,U_k=0; ek = set - jiance; if((ek>(mPIDstruct.Un))||(ek<-(mPIDstruct.Un)))                //积分不灵敏区 U_k=(mPIDstruct.U_kk)+(mPIDstruct.k1)*ek-(mPIDstruct.k2)*(mPIDstruct.ekk)+(mPIDstruct.k3)*(mPIDstruct.ekkk); if(U_k>(mPIDstruct.Ur))                                        //限制最大输出量, U_k=mPIDstruct.Ur; if(U_k<-(mPIDstruct.Ur)) U_k=-(mPIDstruct.Ur);    mPIDstruct.U_kk=U_k; #ifdef __DEBUG_XB__ printf("mPIDstruct.U_kk = %f\r\n",mPIDstruct.U_kk); #endif mPIDstruct.ekkk=mPIDstruct.ekk; mPIDstruct.ekk=ek;       return U_k/1024.0;  } void TempratureCtrl_Init(void) { if(savedata.TempraSet < 20.0 || savedata.TempraSet > 50.0) savedata.TempraSet = 37.5; SetPIDProperty(10000.0,0.5,0.15,5.15,0.2); //配置温度控制PID算法参数 } /********************************************************************  函 数 名:float TempFilter(float prev,float current) 功    能:简单的滤波 说    明: 入口参数:prev 上一次的滤波结果 current 当前检测值 返 回 值:通过滤波后的值 ***********************************************************************/ float TempFilter(float prev,float current) { return (current - 0.2*(current - prev)); } --------------------- 作者:neven_li 来源:CSDN 原文:https://blog.csdn.net/li13158/article/details/79697505 版权声明:本文为博主原创文章,转载请附上博文链接!
STM32和OpenMV的通信可以通过串口实现。以下是一个简单的示例代码: 在STM32上,初始化串口: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); int main(void) { HAL_Init(); SystemClock_Config(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART2) { __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance==USART2) { __HAL_RCC_USART2_CLK_DISABLE(); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); } } ``` 在OpenMV上,初始化串口: ```python import time, serial uart = serial.Serial("/dev/ttyACM0", baudrate=115200, timeout=1000) while(True): if (uart.any()): data = uart.readline() print(data) ``` 在STM32上,向OpenMV发送数据: ```c char data[] = "Hello OpenMV!\r\n"; HAL_UART_Transmit(&huart2, (uint8_t*)data, strlen(data), 1000); ``` 在OpenMV上,向STM32发送数据: ```python uart.write("Hello STM32!\r\n") ``` 注意事项: 1. 在OpenMV上,串口的名称可能会有所不同,需要根据实际情况进行更改。 2. 在使用串口通信时,需要将STM32和OpenMV的地线连接在一起。 3. 在使用串口通信时,需要确保STM32和OpenMV的波特率相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值