/*!
* COPYRIGHT NOTICE
* Copyright (c) 2013,山外科技
* All rights reserved.
* 技术讨论:山外论坛 http://www.vcan123.com
*
* 除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
* 修改内容时必须保留山外科技的版权声明。
*
* @file MK60_uart.c
* @brief uart串口函数
* @author 山外科技
* @version v5.2
* @date 2014-10-09
*/
#include "common.h"
#include "MK60_uart.h"
UART_MemMapPtr UARTN[UART_MAX] = {UART0_BASE_PTR, UART1_BASE_PTR, UART2_BASE_PTR, UART3_BASE_PTR, UART4_BASE_PTR, UART5_BASE_PTR}; //定义五个指针数组保存 UARTN 的地址
/*!
* @brief 初始化串口,设置波特率
* @param UARTn_e 模块号(UART0~UART5)
* @param baud 波特率,如9600、19200、56000、115200等
* @since v5.0
* @note UART所用的管脚在 App\Inc\PORT_cfg.h 里进行配置,
printf所用的管脚和波特率在 App\Inc\MK60_conf.h 里进行配置
* Sample usage: uart_init (UART3, 9600); //初始化串口3,波特率为9600
*/
void uart_init (UARTn_e uratn, uint32 baud)
{
register uint16 sbr, brfa;
uint8 temp;
uint32 sysclk; //时钟
/* 配置 UART功能的 复用管脚 */
switch(uratn)
{
case UART0:
SIM_SCGC4 |= SIM_SCGC4_UART0_MASK; //使能 UART0 时钟
if(UART0_RX_PIN == PTA1)
{
port_init( UART0_RX_PIN, ALT2);
}
else if((UART0_RX_PIN == PTA15) || (UART0_RX_PIN == PTB16) || (UART0_RX_PIN == PTD6) )
{
port_init( UART0_RX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if(UART0_TX_PIN == PTA2)
{
port_init( UART0_TX_PIN, ALT2);
}
else if((UART0_TX_PIN == PTA14) || (UART0_TX_PIN == PTB17) || (UART0_TX_PIN == PTD7) )
{
port_init( UART0_TX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
case UART1:
SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;
if((UART1_RX_PIN == PTC3) || (UART1_RX_PIN == PTE1))
{
port_init( UART1_RX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if((UART1_TX_PIN == PTC4) || (UART1_TX_PIN == PTE0))
{
port_init( UART1_TX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
case UART2:
SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
if(UART2_TX_PIN == PTD3)
{
port_init( UART2_TX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if(UART2_RX_PIN == PTD2)
{
port_init( UART2_RX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
case UART3:
SIM_SCGC4 |= SIM_SCGC4_UART3_MASK;
if((UART3_RX_PIN == PTB10)|| (UART3_RX_PIN == PTC16) || (UART3_RX_PIN == PTE5) )
{
port_init( UART3_RX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if((UART3_TX_PIN == PTB11) || (UART3_TX_PIN == PTC17) || (UART3_TX_PIN == PTE4) )
{
port_init( UART3_TX_PIN, ALT3); //在PTB11上使能UART3_RXD
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
case UART4:
SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;
if((UART4_RX_PIN == PTC14) || (UART4_RX_PIN == PTE25) )
{
port_init( UART4_RX_PIN, ALT3); //在PTC14上使能UART4_RXD
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if((UART4_TX_PIN == PTC15) || (UART4_TX_PIN == PTE24) )
{
port_init( UART4_TX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
case UART5:
SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;
if((UART5_RX_PIN == PTD8) || (UART5_RX_PIN == PTE9))
{
port_init( UART5_RX_PIN, ALT3);
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
if((UART5_TX_PIN == PTD9) ||(UART5_TX_PIN == PTE8))
{
port_init( UART5_TX_PIN, ALT3); //在PTD9上使能UART5_RXD
}
else
{
ASSERT(0); //上诉条件都不满足,直接断言失败了,设置管脚有误?
}
break;
default:
break;
}
//设置的时候,应该禁止发送接受
UART_C2_REG(UARTN[uratn]) &= ~(0
| UART_C2_TE_MASK
| UART_C2_RE_MASK
);
//配置成8位无校验模式
//设置 UART 数据格式、校验方式和停止位位数。通过设置 UART 模块控制寄存器 C1 实现;
UART_C1_REG(UARTN[uratn]) |= (0
//| UART_C1_M_MASK //9 位或 8 位模式选择 : 0 为 8位 ,1 为 9位(注释了表示0,即8位) (如果是9位,位8在UARTx_C3里)
//| UART_C1_PE_MASK //奇偶校验使能(注释了表示禁用)
//| UART_C1_PT_MASK //校验位类型 : 0 为 偶校验 ,1 为 奇校验
);
//计算波特率,串口0、1使用内核时钟,其它串口使用bus时钟
if ((uratn == UART0) || (uratn == UART1))
{
sysclk = core_clk_khz * 1000; //内核时钟
}
else
{
sysclk = bus_clk_khz * 1000; //bus时钟
}
//UART 波特率 = UART 模块时钟 / (16 × (SBR[12:0] + BRFA))
//不考虑 BRFA 的情况下, SBR = UART 模块时钟 / (16 * UART 波特率)
sbr = (uint16)(sysclk / (baud * 16));
if(sbr > 0x1FFF)sbr = 0x1FFF; //SBR 是 13bit,最大为 0x1FFF
//已知 SBR ,则 BRFA = = UART 模块时钟 / UART 波特率 - 16 ×SBR[12:0]
brfa = (sysclk / baud) - (sbr * 16);
ASSERT( brfa <= 0x1F); //断言,如果此值不符合条件,则设置的条件不满足寄存器的设置
//可以通过增大波特率来解决这个问题
//写 SBR
temp = UART_BDH_REG(UARTN[uratn]) & (~UART_BDH_SBR_MASK); //缓存 清空 SBR 的 UARTx_BDH的值
UART_BDH_REG(UARTN[uratn]) = temp | UART_BDH_SBR(sbr >> 8); //先写入SBR高位
UART_BDL_REG(UARTN[uratn]) = UART_BDL_SBR(sbr); //再写入SBR低位
//写 BRFD
temp = UART_C4_REG(UARTN[uratn]) & (~UART_C4_BRFA_MASK) ; //缓存 清空 BRFA 的 UARTx_C4 的值
UART_C4_REG(UARTN[uratn]) = temp | UART_C4_BRFA(brfa); //写入BRFA
//设置FIFO(FIFO的深度是由硬件决定的,软件不能设置)
UART_PFIFO_REG(UARTN[uratn]) |= (0
| UART_PFIFO_TXFE_MASK //使能TX FIFO(注释表示禁止)
//| UART_PFIFO_TXFIFOSIZE(0) //(只读)TX FIFO 大小,0为1字节,1~6为 2^(n+1)字节
| UART_PFIFO_RXFE_MA
没有合适的资源?快使用搜索试试~ 我知道了~
GPIO_LED.rar_K60例程
共167个文件
h:50个
xcl:21个
o:20个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 98 浏览量
2022-09-24
08:12:40
上传
评论
收藏 11.01MB RAR 举报
温馨提示
K60例程,很好的程序,在FX上稳定运行,没有任何错误
资源详情
资源评论
资源推荐
收起资源包目录
GPIO_LED.rar_K60例程 (167个子文件)
iar_cortexM4l_math.a 1.34MB
iar_cortexM4lf_math.a 1.33MB
vcan_Kinetis.FN15_Debug.cspy.bat 2KB
删除临时文件.bat 297B
vcan_Kinetis.pbd.browse 1.91MB
MK60_uart.c 18KB
MK60_lptmr.c 18KB
MK60_conf.c 11KB
MK60_mcg.c 11KB
MK60_flash.c 11KB
VCAN_key.c 8KB
MK60_PIT.c 6KB
vectors.c 5KB
MK60_gpio.c 5KB
system_MK60DZ10.c 5KB
MK60_wdog.c 3KB
MK60_port.c 3KB
VCAN_computer.c 3KB
MK60_SysTick.c 3KB
misc.c 2KB
VCAN_LED.C 2KB
MK60_DWT.c 1KB
main.c 1KB
MK60_it.c 463B
vcan_Kinetis.dep 25KB
vcan_Kinetis.dnx 2KB
vcan_Kinetis.ewd 301KB
vcan_Kinetis.ewp 220KB
vcan_Kinetis.ewt 501KB
vcan_Kinetis.eww 174B
vcan_Kinetis.eww 166B
MK70F15.h 1.12MB
MK70F12.h 1.12MB
MK61F12.h 1.12MB
MK61F15.h 1.12MB
MK60F12.h 1.09MB
MK60F15.h 1.09MB
MK53DZ10.h 915KB
MK40DZ10.h 874KB
MK60DZ10.h 868KB
MK30DZ10.h 843KB
MK51DZ10.h 837KB
MK52DZ10.h 829KB
MK20DZ10.h 791KB
MK10DZ10.h 760KB
MK50DZ10.h 754KB
arm_math.h 237KB
core_cm4.h 107KB
core_cm3.h 97KB
core_sc300.h 96KB
core_sc000.h 41KB
core_cm0plus.h 39KB
MK60_gpio_cfg.h 35KB
core_cm0.h 32KB
common.h 25KB
core_cm4_simd.h 22KB
core_cmInstr.h 20KB
vectors.h 19KB
core_cmFunc.h 17KB
PORT_cfg.h 6KB
MK60_port.h 5KB
MK60_gpio.h 5KB
arm_common_tables.h 5KB
MK60_conf.h 4KB
arm_const_structs.h 4KB
MK60_PIT.h 3KB
MK60_flash.h 2KB
VCAN_key.h 2KB
MK60_mcg.h 2KB
MK60_uart.h 2KB
MK60_lptmr.h 2KB
misc.h 1KB
MK60_SysTick.h 1KB
VCAN_LED.H 962B
VCAN_computer.h 943B
MK60_wdog.h 923B
MK60_it.h 914B
system_MK60DZ10.h 895B
MK60_DWT.h 550B
include.h 528B
iar.h 304B
vcan_Kinetis.hex 39KB
vcan_ROM_K60X512.icf 4KB
vcan_RAM_K60X512.icf 4KB
vcan_ROM_K60N512.icf 4KB
vcan_RAM_K60N512.icf 4KB
vcan_ROM_K60N1M.icf 3KB
64KB_Pflash_64KB_Dflash.icf 2KB
256KB_Pflash_256KB_Dflash.icf 2KB
128KB_Pflash_128KB_Dflash.icf 2KB
512KB_Pflash.icf 2KB
128KB_Ram.icf 2KB
128KB_Pflash.icf 2KB
256KB_Pflash.icf 2KB
32KB_Ram.icf 2KB
64KB_Ram.icf 2KB
vcan_Kinetis_FN15_Debug.jlink 755B
vcan_Kinetis.pbd.linf 3KB
BuildLog.log 3B
vcan_Kinetis.map 24KB
共 167 条
- 1
- 2
朱moyimi
- 粉丝: 64
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 海尔618算价表_七海5.20_16.00xlsx(1)(2).xlsx
- WebCrawler.scr
- 【计算机专业毕业设计】大学生就业信息管理系统设计源码.zip
- YOLO 数据集:8种路面缺陷病害检测【包含划分好的数据集、类别class文件、数据可视化脚本】
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于YOLOv8的FPS TPS AI自动锁定源码+使用步骤说明.zip
- JAVA实现Modbus RTU或Modbus TCPIP案例.zip
- 基于yolov8+streamlit的火灾检测部署源码+模型.zip
- 测试aaaaaaabbbbb
- VID20240521070643.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0