stm32flash -w filename -v -g 0x0 /dev/ttyS0
#!/bin/sh
# author:combofish
# email:[email protected]
# Filename: flash_stm32.sh
port="/dev/ttyUSB0"
stm32flash -w $1 -v -g 0x0 $port
flash_stm32 f1rrct6.hex
你先得在工程属性里配置输出hex文件,才能在Debug/Release文件夹下找到对应工程名的hex文件 右击工程名,属性->C/C++ Build->IAR Linker for ARM->Output Converter->勾选Generate additional output,并在output format下拉框里选择Intel extended
https://www.cnblogs.com/ChurF-Lin/p/10793111.html
int main() {
unsigned char uTx_Data[5] = {0x41, 0x42, 0x43, 0x44, 0x45}; //数组内十六进制代表“ABCDE”
//
while (1) {
//
HAL_UART_Transmit($huart2, uTx_Data, sizeof(uTx_Data), 0xffff);
}
}
uart 发送字符串
在头文件添加声明
void USER_UART_SendString(UART_HandleTypeDef* uartHandle, unsigned char* uData);
在对应的 .c 文件添加 函数
void USER_UART_SendString(UART_HandleTypeDef* uartHandle, unsigned char* uData){
while (*uData){
HAL_UART_Transmit(uartHandle, uData, 1, 1000);
uData++;
}
}
在 main() 函数的主循环中调用
USER_UART_SendString(&huart2, uTx_Data2);
USER_UART_SendString(&huart3, uTx_Data2);
HAL_Delay(500);
接受字符串
接受后就发送
这种接收方式是直接在main函数里的while循环里不断接收,会严重占用程序的进程,且接收较长的数据时,会发生接收错误
int main() {
unsigned char uRx_Data = 0;
//
if(HAL_UART_Receive(&huart2, &uRx_Data, 1, 1000) == HAL_OK){
HAL_UART_Transmit(&huart2, &uRx_Data, 1, 1000);
}
}
在 HALUARTMspInit() 中使能中断
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */
//HAL_UART_Receive_IT(&huart2, rData, 1);
__HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
/* USER CODE END USART2_MspInit 1 */
}
}
在 USART1IRQHandler() 中处理数据
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
unsigned char uRx_Data = 0;
HAL_UART_Receive(&huart2, &uRx_Data, 1, 1000);
HAL_UART_Transmit(&huart2, &uRx_Data, 1, 0xffff);
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
在 HALUARTMspInit() 中使能中断
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
/* USER CODE BEGIN USART2_MspInit 1 */
//HAL_UART_Receive_IT(&huart2, rData, 1);
__HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
/* USER CODE END USART2_MspInit 1 */
}
}
在 USART1IRQHandler() 中处理数据
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
// 中断接收和发送
/* unsigned char uRx_Data = 0;
HAL_UART_Receive(&huart2, &uRx_Data, 1, 1000);
HAL_UART_Transmit(&huart2, &uRx_Data, 1, 0xffff);*/
// 中断接收完再发送
static unsigned char uRx_Data[1024] = {0};
static unsigned char* pRx_Data = uRx_Data;
static unsigned char uLength = 0;
HAL_UART_Receive(&huart2, pRx_Data, 1, 1000);
if (*pRx_Data == '\n'){
HAL_UART_Transmit(&huart2, uRx_Data, uLength, 0xffff);
}else {
uLength++;
pRx_Data++;
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
https://www.cnblogs.com/ChurF-Lin/p/10809000.html https://www.cnblogs.com/ChurF-Lin/p/10809000.html https://www.cnblogs.com/ChurF-Lin/category/1457221.html
SPI 协议 Serial Peripheral Interface 串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASH\ADC\LCD等模块之间的通信。
片选信号线,当有多个SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的, 而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。
时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。
设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。
主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据
http://news.eeworld.com.cn/mcu/2019/ic-news021243150.html https://blog.csdn.net/u014470361/article/details/79015712
(master之间不可通过I2C通信,并且每个master只能轮流使用I2C总线)。
地址
参考链接
https://blog.csdn.net/la_fe_/article/details/100315073
#include
#include
int main(){
unsigned char a[12] = {0};
printf("%s", sizeof(a));
return 0;
}
/* 第1个参数为I2C操作句柄
第2个参数为从机设备地址
第3个参数为从机寄存器地址
第4个参数为从机寄存器地址长度
第5个参数为发送的数据的起始地址
第6个参数为传输数据的大小
第7个参数为操作超时时间 */
HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10);
HAL_I2C_Mem_Write_IT();
HAL_I2C_Mem_Read();
HAL_I2C_Mem_Read_IT();
HAL_I2C_Mem_Read_DMA();
HAL_I2C_Mem_Write_DMA();
HAL_I2C_Master_Receive();// STM32 主机接收,不需要用到寄存器地址
HAL_I2C_Master_Receive_IT();//中断IIC接收
HAL_I2C_Master_Receive_DMA();// DMA 方式的IIC接收
HAL_I2C_Master_Transmit_IT(); //中断IIC发送
HAL_I2C_Master_Transmit_DMA(); // DMA 方式的IIC发送
HAL_I2C_Master_Transmit(&hi2c2,salve_add,PA_BUFF,sizeof(PA_BUFF),0x10); //STM32 主机发送
HAL_I2C_Slave_Receive();// STM32 从机机接收,不需要用到寄存器地址
HAL_I2C_Slave_Transmit();// STM32 从机机发送,不需要用到寄存器地址
HAL_I2C_Slave_Receive_IT();
HAL_I2C_Slave_Receive_DMA();
HAL_I2C_Slave_Transmit_IT();
HAL_I2C_Slave_Transmit_DMA();
//举个调用 HAL_I2C_Mem_Write()函数读取16个字节的使用例子
HAL_I2C_Mem_Read(&hi2c2,U9_Save_Read_Add,ADC_Result_Add,I2C_MEMADD_SIZE_8BIT,Read_buff,2,0xff);
//再举一个 HAL_I2C_Mem_Read( ) 函数写16个字节的使用例子
uint8_t Configuration_config[2]={0x09,0xc0};
//设置U9的Configuration寄存器为 0x09 0xc0
HAL_I2C_Mem_Write(&hi2c2,U9_Save_Write_Add,ADC_Configuration_Add,I2C_MEMADD_SIZE_8BIT,Configuration_config,2,0xff);
https://www.cnblogs.com/xingboy/p/9566247.html
http://www.eemaker.com/stm32-hal-i2c-24c02.html