GD32 CAN1和TIMER0同時開啟問題

背景:今天在一個項目調試的時候發現了一些問題,由此貼記錄一下問題解決的過程。

使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用這連個外設的時候發送了一些問題。

單獨使用CAN1。功能正常。

單獨使用TIMER0。配置為輸出模式。功能正常。

但是當兩個功能同時使用,初始化的時候,就出問題了。


1、引腳配置

//TIMER0 引腳定義
#define   TIMER0_CH2_GPIO_PIN              GPIO_PIN_10
#define   TIMER0_CH1_GPIO_PIN              GPIO_PIN_9
#define   TIMER0_CH2N_GPIO_PIN             GPIO_PIN_15
#define   TIMER0_CH1N_GPIO_PIN             GPIO_PIN_14
//CAN1引腳定義
#define   CAN1_CLOCK                    RCU_GPIOB
#define   CAN1_GPIO                     GPIOB
#define   CAN1_TX_GPIO_PIN              GPIO_PIN_13
#define   CAN1_RX_GPIO_PIN              GPIO_PIN_12

?從引腳上看,每個是沒有用到重復的引腳的。都是單獨分開。

2、發現問題

但是這時候,會導致一個問題。

CAN1的初始化失敗了。

//這是底層的庫函數,CAN初始化
ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init)
{uint32_t timeout = CAN_TIMEOUT;ErrStatus flag = ERROR;/* disable sleep mode */CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD;/* enable initialize mode */CAN_CTL(can_periph) |= CAN_CTL_IWMOD;/* wait ACK */while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){timeout--;}/* check initialize working success */if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){flag = ERROR;}else{/* set the bit timing register */CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U)));/* time trigger communication mode */if(ENABLE == can_parameter_init->time_triggered){CAN_CTL(can_periph) |= CAN_CTL_TTC;}else{CAN_CTL(can_periph) &= ~CAN_CTL_TTC;}/* automatic bus-off managment */if(ENABLE == can_parameter_init->auto_bus_off_recovery){CAN_CTL(can_periph) |= CAN_CTL_ABOR;}else{CAN_CTL(can_periph) &= ~CAN_CTL_ABOR;}/* automatic wakeup mode */if(ENABLE == can_parameter_init->auto_wake_up){CAN_CTL(can_periph) |= CAN_CTL_AWU;}else{CAN_CTL(can_periph) &= ~CAN_CTL_AWU;}/* automatic retransmission mode disable */if(ENABLE == can_parameter_init->no_auto_retrans){CAN_CTL(can_periph) |= CAN_CTL_ARD;}else{CAN_CTL(can_periph) &= ~CAN_CTL_ARD;}/* receive fifo overwrite mode */        if(ENABLE == can_parameter_init->rec_fifo_overwrite){CAN_CTL(can_periph) |= CAN_CTL_RFOD;}else{CAN_CTL(can_periph) &= ~CAN_CTL_RFOD;} /* transmit fifo order */if(ENABLE == can_parameter_init->trans_fifo_order){CAN_CTL(can_periph) |= CAN_CTL_TFO;}else{CAN_CTL(can_periph) &= ~CAN_CTL_TFO;}  /* disable initialize mode */CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD;timeout = CAN_TIMEOUT;/* wait the ACK */while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){timeout--;}/* check exit initialize mode */if(0U != timeout){flag = SUCCESS;}}  return flag;
}

進入這個函數后,會進入使能初始化工作工作模式。這個查看用戶手冊可以查到。

下圖是進入函數運行中的寄存器狀態。這是是出于初始化工作狀態的

但退出函數之前,發現并沒有退出初始化工作模式。導致初始化失敗了。

3、定位問題

在定位問題的過程中,試了一下把TIMER0的初始化先屏蔽掉。結果就又正常了。

因此定位問題發生在TIMER0的初始化。

但是很奇怪,TIMER0的初始化,只初始化了通道1,和通道2,沒有初始化通道0,按理說是不應該有影響的。

查看了寄存器

這個地方導致,這個腳被初始化為輸出。再看下一個寄存器。

這里導致輸出為高電平,和示波器抓到的波形一樣。

所以這就是導致CAN1初始化失敗的原因。

4、原理

5、解決方法

把通道0配置初始化為輸入模式。就能解決問題了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88710.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

劍指offer56_數組中唯一只出現一次的數字

數組中唯一只出現一次的數字在一個數組中除了一個數字只出現一次之外,其他數字都出現了三次。 請找出那個只出現一次的數字。 你可以假設滿足條件的數字一定存在。 思考題: 如果要求只使用 O(n) 的時間和額外 O(1) 的空間,該怎么做呢&#xf…

從語音識別到智能助手:Voice Agent 的技術進化與交互變革丨Voice Agent 學習筆記

From Research AI: 最近看到 Andrew Ng 的一句話讓我印象深刻:“While some things in AI are overhyped, voice applications seem underhyped right now.”(盡管 AI 中有些領域被過度炒作,語音應用卻似乎被低估了)。…

什么是Jaccard 相似度(Jaccard Similarity)

文章目錄? 定義:📌 取值范圍:🔍 舉例說明:🧠 應用場景:?? 局限性:💡 擴展概念:Jaccard 相似度(Jaccard Similarity) 是一種用于衡量…

ragflow_多模態文檔解析與正文提取策略

多模態文檔解析與正文提取策略 RAGflow的文檔解析系統位于deepdoc/parser/目錄下,實現了對多種文檔格式的統一解析處理。該系統采用模塊化設計,針對不同文檔格式提供專門的解析器,并通過視覺識別技術增強解析能力。本文將深入探討RAGflow的文檔解析系統的設計原理、實現細節…

數據結構棧的實現(C語言)

棧的基本概念棧是一種特殊的線性存儲結構,是一種操作受到限制的線性表,特殊體現在兩個地方:1、元素進棧出棧的操作只能從同一端完成,另一端是封閉的,通常將數據進棧叫做入棧,壓棧等,出棧叫做彈棧…

【springboot】IDEA手動創建SpringBoot簡單工程(無插件)

大致步驟 創建Maven工程 引入依賴 提供啟動類 詳細教程 創建Maven工程 修改pom.xml文件 添加父節點 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</…

獨立開發第二周:構建、執行、規劃

一 第二周的獨立開發旅程落下帷幕。相較于第一周的適應&#xff0c;本周的核心詞是“聚焦”與“執行”。 目標非常明確&#xff1a;在產品開發上取得進展&#xff1b;在個人工作節奏上&#xff0c;將上周初步形成的框架進行實踐與固化。 同時&#xff0c;為至關重要的自媒體運營…

在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模塊的技術報告

在YOLO-World中集成DeformConv、CBAM和Cross-Modal Attention模塊的技術報告 1. 引言 1.1 項目背景 目標檢測是計算機視覺領域的核心任務之一,而YOLO(You Only Look Once)系列算法因其出色的速度和精度平衡而廣受歡迎。YOLO-World是YOLO系列的最新發展,專注于開放詞匯目標…

從UI設計到數字孿生實戰應用:構建智慧金融的風險評估與預警平臺

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;傳統金融風控的 “滯后困境” 與數字孿生的破局之道金融風險的隱蔽性、突…

【Linux】權限相關指令

前言&#xff1a; 上兩篇文章我們講到了&#xff0c;關于Linux中的基礎指令。 【Linux】初見&#xff0c;基礎指令-CSDN博客【Linux】初見&#xff0c;基礎指令&#xff08;續&#xff09;-CSDN博客 本文我們來講Linux中關于權限中的一些指令 shell命令 Linux嚴格來說是一個操…

前端學習3--position定位(relative+absolute+sticky)

繼上一篇&#xff0c;做下拉菜單的時候&#xff0c;涉及到了position&#xff0c;這篇就來學習下~先看下position在下拉菜單中的應用&#xff1a;一、關鍵代碼回顧&#xff1a;/* 下拉菜單容器 */ .dropdown {position: relative; /* ? 關鍵父級 */ }/* 下拉內容&#xff08;默…

APP Inventor使用指南

APP Inventor使用指南一、組件介紹二、邏輯設計設計方法&#xff1a;設計實例&#xff08;參考嘉立創教程&#xff09;點擊跳轉 &#xff1a; app inventor&#xff08;點不開的話需要&#x1fa84;&#x1fa84;&#x1fa84;&#x1fa84;&#x1fa84;&#xff09; 一、組…

SpringAI實現保存聊天記錄到redis中

redis相關準備添加依賴我利用redission來實現<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.37.0</version> </dependency>添加配置文件spring:redis:database: 5host: 127.0.0.1…

Unity中使用EzySlice實現模型切割與UV控制完全指南

引言 在Unity中實現3D模型的動態切割是一個常見的需求&#xff0c;無論是用于游戲特效、建筑可視化還是醫療模擬。本文將全面介紹如何使用EzySlice插件實現高效的模型切割&#xff0c;并深入探討如何通過Shader Graph精確控制切割面的UV映射。 第一部分&#xff1a;EzySlice基…

【c++學習記錄】狀態模式,實現一個登陸功能

狀態模式建議為對象的所有可能狀態新建一個類&#xff0c; 然后將所有狀態的對應行為抽取到這些類中。 原始對象被稱為上下文 &#xff08;context&#xff09;&#xff0c; 它并不會自行實現所有行為&#xff0c; 而是會保存一個指向表示當前狀態的狀態對象的引用&#xff0c;…

Docker 搭建 Harbor 私有倉庫

1 部署 Harbor 注意&#xff1a;docker、docker-compose、Harbor的版本是否適配&#xff0c;這里使用的版本如下表&#xff1a; Docker版本Docker Compose版本Harbor版本v19.09.8v1.29.2v2.8.2 1.1 安裝 docker-compose # 下載 docker-compose 1.29.2 版本 curl -L "h…

C++類模板繼承部分知識及測試代碼

目錄 0.前言 1.類模板基本使用 2.類模板繼承 2.1類模板繼承過程中的模板參數 情況1&#xff1a;父類非模板&#xff0c;子類為模板 情況2&#xff1a;父類模板&#xff0c;子類為非模板 情況3&#xff1a;父類模板&#xff0c;子類為模板 3.STL中的模板類分析 3.1STL中…

Laravel + Python 圖片水印系統:實現與調試指南

前言 本系統通過 Laravel 作為前端框架接收用戶上傳的圖片&#xff0c;調用 Python 腳本處理水印添加&#xff0c;最終返回處理后的圖片。這種架構充分利用了 Laravel 的便捷性和 Python 圖像處理庫的強大功能。 一、Python 水印處理腳本 from PIL import Image, ImageEnhance …

【速通RAG實戰:企業應用】25、從數智化場景看RAG:是臨時方案,還是終局架構?

引言&#xff1a;RAG為何成為數智化場景的"必爭之地"&#xff1f; 當ChatGPT在2023年掀起生成式AI浪潮時&#xff0c;一個矛盾逐漸凸顯&#xff1a;大語言模型&#xff08;LLM&#xff09;能生成流暢文本&#xff0c;卻常陷入"幻覺"&#xff08;虛構事實&a…

[Python] -實用技巧篇1-用一行Python代碼搞定日常任務

在日常開發或數據處理過程中,我們常常為了一些簡單的小任務寫出數行代碼。但實際上,Python 提供了大量強大且簡潔的語法糖和標準庫工具,讓你用“一行代碼”輕松搞定復雜操作。 本文將通過多個典型場景展示如何用“一行 Python 代碼”高效完成常見任務。 一、文件操作:快速…