我试图让外部中断在 Nucleo-F030R8上运行 ,但遇到了困难。
一切都已配置并在单步模式下运行得很好,但是当我使用简单的跳线将我的板连接到另一个测试板并运行相同的代码时,即使该测试板(第二个 Nucleo-F302R8,应该只产生一个我想用第一个信号峰值来测量的信号峰值)未打开。
我混合使用了 STM 的 HAL 库和我自己的一些代码。
有人最终遇到过类似的问题吗?我正在使用 STM32 的系统工作台。
部分ISR、Interrupthandler被删掉
void EXTI0_1_IRQHandler(void)
{
   /* USER CODE BEGIN EXTI0_1_IRQn 0 */
   if ((EXTI->IMR & EXTI_IMR_MR0) && (EXTI->PR & EXTI_PR_PR0))
   {
       int_flag_pin.copen = 1;
   }
   if ((EXTI->IMR & EXTI_IMR_MR1) && (EXTI->PR & EXTI_PR_PR1))
   {
      int_flag_pin.ma1 = 1;
   }
   /* USER CODE END EXTI0_1_IRQn 0 */
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
   /* USER CODE BEGIN EXTI0_1_IRQn 1 */
   /* USER CODE END EXTI0_1_IRQn 1 */
}
Run Code Online (Sandbox Code Playgroud)
在将引脚设置为低电平和改变上升电平之间,中断被触发。
TEST_GPIO_Port->BSRR = (uint32_t) …Run Code Online (Sandbox Code Playgroud) 我开始在 STM32F103xx MCU 中对 CAN 外设环回模式的 HAL 驱动程序进行基本使用。根据MCU的用户手册,当传输完全完成并且数据在CAN总线上可用时,CAN_TSR寄存器的TME、RQCP和TXOK位被硬件置1,表明相应的邮箱已变空,并且传输成功。
当我调试以下程序时,CAN_TSR 寄存器中没有发生上述任何更改。我只能看到 TME 位被设置,这意味着提供了一个邮箱用于传输,但从未传输。
我的这段代码导致程序中出现不定式循环:
while(HAL_CAN_IsTxMessagePending(&hcan, TxMailbox));
Run Code Online (Sandbox Code Playgroud)
您能解释一下我的问题是什么以及我应该做什么吗?感谢您的想法。
这是完整的代码:
#include "main.h"
CAN_HandleTypeDef hcan;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
/* USER CODE BEGIN PFP */
void Can_TX(void);
/* USER CODE END PFP */
int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  /* USER CODE BEGIN 2 …Run Code Online (Sandbox Code Playgroud) 我遇到了类似于以下(或多或少最小)示例的 C++ 代码。请考虑底部函数中标记的方法调用:
#include <memory>
static unsigned returnValue = 5;
void setReturnValue(unsigned u) { returnValue = u; }
class MyObject
{
    public:
        MyObject(unsigned uIN) : u(uIN) {}
        ~MyObject() { u = 42; }
        void method(std::unique_ptr<MyObject> uniqPtrToObject)
        {
            // Do something fancy with this unique pointer now, 
            // which will consume the object and its data
            setReturnValue(uniqPtrToObject->getValue());
        }
        unsigned getValue() { return u; }
    private:
        unsigned u;    // Some relevant object data
};
std::unique_ptr<MyObject> GetUniqToObject(unsigned u)
{
    // Get the object …Run Code Online (Sandbox Code Playgroud)