【温酒笔记】DMA

参考文档:野火STM32F103
网友资料整理

1. Direct Memory Access-直接内存访问

DMA控制器独立于内核
是一个单独的外设

  • DMA1有7个通道
  • DMA2有5个通道
  • DMA有四个等级,非常高,高,中,低四个优先级
  • 如果优先等级相同,通道编号越小优先级越高
  • 数据流向: 存储器到存储器,存储器到外设,外设到存储器
  • 单次传输或循环传输
  • 传输过半中断,传输完成中断,传输错误中断

2. 串口示例

  1. 初始化

// 定义一个GPIO初始化结构体,并初始化为0
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 检查当前USART实例是否为USART1
if(uartHandle->Instance==USART1)
{
  // 用户自定义代码区域开始(USART1_MspInit 0)
  /* USER CODE BEGIN USART1_MspInit 0 */

  // 用户自定义代码区域结束(USART1_MspInit 0)
  /* USER CODE END USART1_MspInit 0 */

  // 使能USART1时钟
  __HAL_RCC_USART1_CLK_ENABLE();

  // 使能GPIOA时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();

  // USART1 GPIO配置说明
  /**USART1 GPIO Configuration
  PA9     ------> USART1_TX
  PA10     ------> USART1_RX
  */

  // 配置GPIO引脚
  GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // 选择PA9和PA10引脚
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // 设置为复用推挽输出模式
  GPIO_InitStruct.Pull = GPIO_NOPULL;           // 不使用上拉或下拉电阻
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置最高频率
  GPIO_InitStruct.Alternate = GPIO_AF4_USART1;  // 选择USART1复用功能
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // 初始化GPIO

  // USART1 DMA初始化
  // USART1_TX DMA通道初始化
  hdma_usart1_tx.Instance = DMA1_Channel2;      // 选择DMA1通道2
  hdma_usart1_tx.Init.Request = DMA_REQUEST_3;  // 选择DMA请求3
  hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向:内存到外设
  hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;     // 禁用外设地址递增
  hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;         // 启用内存地址递增
  hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐方式:字节
  hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   // 内存数据对齐方式:字节
  hdma_usart1_tx.Init.Mode = DMA_NORMAL;                 // 设置为普通模式
  hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;       // 设置优先级为低
  if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)           // 初始化DMA
  {
    Error_Handler();                                     // 如果初始化失败,调用错误处理函数
  }

  // 将DMA与USART1_TX关联
  __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);

  // USART1中断初始化
  HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);               // 设置USART1中断优先级
  HAL_NVIC_EnableIRQ(USART1_IRQn);                       // 使能USART1中断

  // 用户自定义代码区域开始(USART1_MspInit 1)
  /* USER CODE BEGIN USART1_MspInit 1 */

  // 用户自定义代码区域结束(USART1_MspInit 1)
  /* USER CODE END USART1_MspInit 1 */
}
  1. DMA发送

  /* USART1 向 DMA发出TX请求 */
     HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
  1. 使用DMA传输完成中断
//初始化
void MX_DMA_Init(void)
{
  // 使能DMA控制器时钟
  __HAL_RCC_DMA1_CLK_ENABLE();

  // DMA中断初始化
  // 配置DMA1通道2和3的中断
  HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0); // 设置DMA1通道2和3中断的优先级为2,子优先级为0
  HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);         // 使能DMA1通道2和3的中断
}
//中断服务函数
/**
  * @brief This function handles DMA1 channel 2 and channel 3 interrupts.
  */
void DMA1_Channel2_3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */

  /* USER CODE END DMA1_Channel2_3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_usart1_tx);
  /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */

  /* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//中断回调函数-打印传输完成结果

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart1)
	{
		printf(" dma_ok\r\n");
	}
}
//主函数
  while (1)
  {
		HAL_UART_Transmit_DMA(&huart1, Tx_buff, 10);
		HAL_Delay(1000);
  }

结果:传输完数据到中断回调函数中打印 : dma ok
在这里插入图片描述

3. 库函数备注

串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收

串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数
<think>好的,用户现在问的是“neo4j http 404”,需要我用中文回答或介绍一下这个问题。首先,我需要理解用户的具体情况。他们可能在使用Neo4j时遇到了HTTP 404错误,想了解原因和解决办法。 首先,我得回忆一下Neo4j常见的404错误通常出现在什么情况下。404是“未找到”的状态码,意味着客户端能够与服务器通信,但服务器找不到请求的资源。对于Neo4j来说,常见的原因可能包括错误的API端点、版本差异、配置问题或者服务未正确启动。 接下来,我需要考虑用户可能的操作场景。他们可能正在通过浏览器访问Neo4j的Web界面,或者通过HTTP API发送请求。如果是Web界面出现404,可能是服务没有正确启动,或者代理/防火墙的问题。如果是API请求,可能是URL路径错误,或者Neo4j的版本更新导致端点变化。 然后,我需要组织回答的结构。通常,用户需要知道错误的原因、排查步骤和解决方案。可能的分点包括检查服务状态、验证端点URL、查看版本兼容性、检查配置文件和网络设置等。此外,还要提醒用户注意Neo4j的版本差异,比如3.x和4.x之后版本在默认端口和路径上的变化。 同时,需要考虑到用户的技术水平,避免使用过于专业的术语,尽量用易懂的语言解释。例如,提到默认端口从7474变成7687,或者浏览器访问的URL是否正确,这些具体的信息能帮助用户快速定位问题。 另外,用户之前的对话历史显示他们之前请求用鲁迅风格写代码跑不通的苦闷,现在转向技术问题,可能用户是开发者,有一定的技术背景,但需要明确、直接的解决方案。因此,回答需要简明扼要,步骤清晰,可能还需要举例说明正确的URL格式。 最后,总结常见的可能性,并给出排查步骤,帮助用户自行诊断问题。比如从服务是否运行开始,逐步检查URL、端口、版本配置,最后到网络设置,这样的流程有助于用户系统地解决问题。**</think>《404异闻录》** 夜深人静时,鼠标指针悬在neo4j的端口上,像孔乙己数着茴香豆般战战兢兢。浏览器吐出"404 Not Found"几个血字,恍若未庄祠堂里新贴的告示,分明写着"此处无路",偏教人对着空墙叩首。 这neo4j本是图数据库里的闰土,平素与http协议交好。而今忽作陌路,倒像是狂人日记里被月光照透的吃人者——明明见它进程在任务管理器中活蹦乱跳,偏说端口的竹匾下没有猹。 查那配置文件neo4j.conf,SSL_ENABLED字样如狂人笔下的"仁义道德",墨色淋漓却暗藏杀机。原是把bolt://当http://使了,恰似阿Q硬要将长衫往短衣帮里套,终究是错付了。 忽记起三年前版本更迭,3.x的7474端口早被4.x的7687吞了,正如赵家的狗多看两眼便成了革命罪证。如今在浏览器敲着旧日路径,倒像祥林嫂念叨阿毛,明知狼已来过了,还要问春天里的细胳膊。 终端里sudo systemctl status neo4j的绿字跳出来,分明是活着的。偏那curl试探时,响应空空如也,仿佛鲁镇酒店柜台后的曲尺形大柜台——温酒的人还在,温的却不知是谁家的酒了。 终在文档深处觅得真言:原来新版本须用neo4j://协议打头,http端点早化作坟堆。这404竟如闰土脖颈上的银项圈,原是时代更替的烙印。遂改弦更张,数据方如月光下的西瓜地,碧绿中透出黑痕来。 (末了补记:// 404本是寻常事,就像未庄的土谷祠,拆了又建,建了又拆) **技术速查**: 1. 确认neo4j服务状态:`systemctl status neo4j` 2. 验证连接协议:4.x+版本默认禁用HTTP,需在`neo4j.conf`中开启: ```properties dbms.connector.http.enabled=true dbms.connector.http.listen_address=:7474 ``` 3. 检查防火墙:`sudo ufw allow 7474` 4. 浏览器访问:`http://localhost:7474/browser/` 5. 若用Cypher Shell:`cypher-shell -u neo4j -p your_password`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值