Add F1 differences.

Create can_device.h files to define specific code for the STM32 family
pull/3737/head
bcostm 2017-02-08 15:20:16 +01:00
parent 45c7e0dca9
commit 311648ab6c
3 changed files with 121 additions and 3 deletions

View File

@ -0,0 +1,42 @@
/* mbed Microcontroller Library
* Copyright (c) 2006-2017 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MBED_CAN_DEVICE_H
#define MBED_CAN_DEVICE_H
#include "cmsis.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef DEVICE_CAN
#define CAN_NUM 1 // Number of CAN peripherals present in the STM32 serie
#define CAN1_IRQ_RX_IRQN CEC_CAN_IRQn
#define CAN1_IRQ_RX_VECT CAN_IRQHandler
#define CAN1_IRQ_TX_IRQN CEC_CAN_IRQn
#define CAN1_IRQ_TX_VECT CAN_IRQHandler
#define CAN1_IRQ_ERROR_IRQN CEC_CAN_IRQn
#define CAN1_IRQ_ERROR_VECT CAN_IRQHandler
#define CAN1_IRQ_PASSIVE_IRQN CEC_CAN_IRQn
#define CAN1_IRQ_PASSIVE_VECT CAN_IRQHandler
#define CAN1_IRQ_BUS_IRQN CEC_CAN_IRQn
#define CAN1_IRQ_BUS_VECT CAN_IRQHandler
#endif // DEVICE_CAN
#endif

View File

@ -0,0 +1,42 @@
/* mbed Microcontroller Library
* Copyright (c) 2006-2017 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MBED_CAN_DEVICE_H
#define MBED_CAN_DEVICE_H
#include "cmsis.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef DEVICE_CAN
#define CAN_NUM 1 // Number of CAN peripherals present in the STM32 serie
#define CAN1_IRQ_RX_IRQN CAN1_RX0_IRQn
#define CAN1_IRQ_RX_VECT CAN1_RX0_IRQHandler
#define CAN1_IRQ_TX_IRQN CAN1_TX_IRQn
#define CAN1_IRQ_TX_VECT CAN1_TX_IRQHandler
#define CAN1_IRQ_ERROR_IRQN CAN1_SCE_IRQn
#define CAN1_IRQ_ERROR_VECT CAN1_SCE_IRQHandler
#define CAN1_IRQ_PASSIVE_IRQN CAN1_SCE_IRQn
#define CAN1_IRQ_PASSIVE_VECT CAN1_SCE_IRQHandler
#define CAN1_IRQ_BUS_IRQN CAN1_SCE_IRQn
#define CAN1_IRQ_BUS_VECT CAN1_SCE_IRQHandler
#endif // DEVICE_CAN
#endif

View File

@ -21,10 +21,10 @@
#include "pinmap.h"
#include "PeripheralPins.h"
#include "mbed_error.h"
#include "can_device.h" // Specific to STM32 serie
#include <math.h>
#include <string.h>
#define CAN_NUM 1
static CAN_HandleTypeDef CanHandle;
static uint32_t can_irq_ids[CAN_NUM] = {0};
static can_irq_handler irq_handler;
@ -393,6 +393,15 @@ static void can_irq(CANName name, int id)
tmp1 = __HAL_CAN_TRANSMIT_STATUS(&CanHandle, CAN_TXMAILBOX_0);
tmp2 = __HAL_CAN_TRANSMIT_STATUS(&CanHandle, CAN_TXMAILBOX_1);
tmp3 = __HAL_CAN_TRANSMIT_STATUS(&CanHandle, CAN_TXMAILBOX_2);
if (tmp1){
__HAL_CAN_CLEAR_FLAG(&CanHandle, CAN_FLAG_RQCP0);
}
if (tmp2){
__HAL_CAN_CLEAR_FLAG(&CanHandle, CAN_FLAG_RQCP1);
}
if (tmp3){
__HAL_CAN_CLEAR_FLAG(&CanHandle, CAN_FLAG_RQCP2);
}
if(tmp1 || tmp2 || tmp3)
{
irq_handler(can_irq_ids[id], IRQ_TX);
@ -427,10 +436,27 @@ static void can_irq(CANName name, int id)
}
}
#if defined(TARGET_STM32F0)
void CAN_IRQHandler(void)
{
can_irq(CAN_1, 0);
}
#endif
#if defined(TARGET_STM32F1)
void CAN1_RX0_IRQHandler(void )
{
can_irq(CAN_1, 0);
}
void CAN1_TX_IRQHandler(void)
{
can_irq(CAN_1, 0);
}
void CAN1_SCE_IRQHandler(void)
{
can_irq(CAN_1, 0);
}
#endif
void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
{
@ -444,23 +470,31 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
switch (type) {
case IRQ_RX:
ier = CAN_IT_FMP0;
irq_n = CAN1_IRQ_RX_IRQN;
vector = (uint32_t)&CAN1_IRQ_RX_VECT;
break;
case IRQ_TX:
ier = CAN_IT_TME;
irq_n = CAN1_IRQ_TX_IRQN;
vector = (uint32_t)&CAN1_IRQ_TX_VECT;
break;
case IRQ_ERROR:
ier = CAN_IT_ERR;
irq_n = CAN1_IRQ_ERROR_IRQN;
vector = (uint32_t)&CAN1_IRQ_ERROR_VECT;
break;
case IRQ_PASSIVE:
ier = CAN_IT_EPV;
irq_n = CAN1_IRQ_PASSIVE_IRQN;
vector = (uint32_t)&CAN1_IRQ_PASSIVE_VECT;
break;
case IRQ_BUS:
ier = CAN_IT_BOF;
irq_n = CAN1_IRQ_BUS_IRQN;
vector = (uint32_t)&CAN1_IRQ_BUS_VECT;
break;
default: return;
}
irq_n = CEC_CAN_IRQn;
vector = (uint32_t)&CAN_IRQHandler;
}
if (enable) {